【问题标题】:How to Conditionally Use JSExport Protocol in 10.7+ apps?如何在 10.7+ 应用程序中有条件地使用 JSExport 协议?
【发布时间】:2014-06-11 16:50:47
【问题描述】:

我正在编写一个最低部署目标为 10.7 的应用程序。因此,每当我尝试包含符合 JSExport 的协议时,编译器都会说它找不到“JSExport”的协议声明。

如果我将最小部署目标设置为 10.9,它编译得很好。这是一个非编译代码的例子。

#import <Cocoa/Cocoa.h>
#import <JavaScriptCore/JavaScriptCore.h>
#import <WebKit/WebKit.h>

@protocol MyJSExport <JSExport>
-(void)doSomething;
@end

我尝试按照示例集here 在运行时动态创建 MyJSExport 协议,但他们的结论是它不起作用。

那么如何编写一个符合 JSExport 的协议,同时保持 10.7 的最低部署目标?

【问题讨论】:

    标签: objective-c macos javascriptcore


    【解决方案1】:

    JSExport 协议导致为协议中的属性定义 Javascript getter/setter,并为协议中定义的方法定义 Javascript 包装函数。

    它在 10.9 之前不存在。

    答案取决于您对低于 10.9 的目标的预期行为

    假设您只是希望在较旧的目标中默默地忽略此功能,然后检查 &lt;JSExport.h&gt; 提供了有关如何执行此操作的线索 - 通过插入您自己的 JSExport 空协议(就像 &lt;JSExport.h&gt; 所做的那样)如果它是尚未定义(如下所示),为您提供在针对 10.7 与 10.9 进行编译时无需更改的代码

    但是:检查 JavaScriptCore 标头,我希望 10.9 引入的其余 Objective-C Javascript 桥接功能将被禁用,直到您针对 10.9 的目标进行编译 - 您是否使用 JSContext还是JSValue?

    #import <Cocoa/Cocoa.h>
    #import <JavaScriptCore/JavaScriptCore.h>
    #import <WebKit/WebKit.h>
    
    // Check if JSExport functionality is available
    #if !JSC_OBJC_API_ENABLED
    @protocol JSExport
    @end
    #endif
    
    @protocol MyJSExport <JSExport>
    -(void)doSomething;
    @end
    

    【讨论】:

    • 这至少可以编译。我还没有测试 10.7 和 10.8 以确保它不会阻塞,但是添加运行时检查以避免代码应该更容易。我主要使用 JSContext 作为 Obj-C 和 Javascript 之间的桥梁。我真的不想回到旧的虚假计划黑客。
    猜你喜欢
    • 2015-03-22
    • 2014-02-21
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    相关资源
    最近更新 更多