【问题标题】:JavaScriptCore framework availability on iOSiOS 上的 JavaScriptCore 框架可用性
【发布时间】:2014-05-07 09:58:20
【问题描述】:

我正在使用 introduced in iOS 7 的 JavaScriptCore 框架。我的应用有一个 iOS 6.0 部署目标。我将应用程序与 JavaScriptCore.framework 链接(默认情况下在 required 模式下)。新的JavaScript Objective-C classesJSContextJSValue 等)在 iOS 6 上运行时显然不可用,但我仍然可以使用纯 C API,即JSGlobalContextCreate()JSObjectCallAsFunction() 等。

如果我链接 iOS 7 中也引入的 MultipeerConnectivity 框架并在 iOS 6 上运行我的应用程序,我会在启动时遇到预期的崩溃:

dyld: Library not loaded: /System/Library/Frameworks/MultipeerConnectivity.framework/MultipeerConnectivity
  Referenced from: /var/mobile/Applications/5AB83411-CEFC-437D-88F8-6B80C36CCE9F/MyApp.app/MyApp
  Reason: image not found

当我链接 JavaScriptCore 框架时,为什么我的应用程序没有崩溃并出现相同的 dyld 错误?

【问题讨论】:

    标签: ios javascriptcore


    【解决方案1】:

    将 JavaScriptCore 框架与 iOS 7 部署目标链接时,应用链接到 Frameworks/JavaScriptCore.framework

    otool -L -arch armv7 MyApp 
    MyApp:
        /System/Library/Frameworks/JavaScriptCore.framework/JavaScriptCore (compatibility version 1.0.0, current version 537.51.2)
        /System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 2935.137.0)
        ...
    

    将 JavaScriptCore 框架与 iOS 6 部署目标链接时,应用链接到 PrivateFrameworks/JavaScriptCore.framework

    otool -L -arch armv7 MyApp
    MyApp:
        /System/Library/PrivateFrameworks/JavaScriptCore.framework/JavaScriptCore (compatibility version 1.0.0, current version 537.51.2)
        /System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 2935.137.0)
        ...
    

    这是因为 JavaScriptCore 框架有 special symbols 指示链接器根据部署目标版本更改其 dylib 安装路径:

    nm JavaScriptCore.framework/JavaScriptCore | grep '\$ld\$'
    00000000003959a0 S $ld$install_name$os4.3$/System/Library/PrivateFrameworks/JavaScriptCore.framework/JavaScriptCore
    00000000003959a1 S $ld$install_name$os5.0$/System/Library/PrivateFrameworks/JavaScriptCore.framework/JavaScriptCore
    00000000003959a2 S $ld$install_name$os5.1$/System/Library/PrivateFrameworks/JavaScriptCore.framework/JavaScriptCore
    00000000003959a3 S $ld$install_name$os6.0$/System/Library/PrivateFrameworks/JavaScriptCore.framework/JavaScriptCore
    00000000003959a4 S $ld$install_name$os6.1$/System/Library/PrivateFrameworks/JavaScriptCore.framework/JavaScriptCore
    

    JavaScriptCore 框架在 iOS 4.3 到 6.1 的 PrivateFrameworks 目录中可用,因此应用程序在启动时会在其中找到它。在 iOS 7 上,PrivateFrameworks/JavaScriptCore.framework 是指向 Frameworks/JavaScriptCore.framework 的符号链接,因此应用程序可以在 iOS 6 和 7 上运行。

    虽然没有在任何地方记录,但这显然是 Apple 为向 JavaScriptCore 框架添加向后兼容性而有意采取的举措。但不幸的是,App Store 验证团队没有从 JavaScriptCore 团队和链接 JavaScriptCore 框架并针对 iOS 7 will be rejected 以下的应用程序获得备忘录,因为他们正在使用 PrivateFrameworks 目录中的框架。如果您希望 Apple 解决此问题,请复制 rdar://problem/17076670

    与此同时,您可以通过从项目中删除 JavaScriptCore 框架并改用以下其他链接器标志来解决拒绝问题(针对您遇到的每个未定义符号错误进行调整)

    -Wl,-U,_JSGlobalContextCreate
    -Wl,-U,_JSGlobalContextRelease
    

    这告诉链接器动态解析符号。由于 JavaScriptCore 框架总是通过 UIKit → WebKit → JavaScriptCore 间接加载,符号将在运行时很好地解析,并且您的应用不应被拒绝,因为它不再显式链接 JavaScriptCore 框架。

    【讨论】:

    • 我敢打赌,这也与 LGPL 合规性有关。
    • 我很确定这与 LGPL 合规性无关,只是 SDK 不兼容的问题。
    猜你喜欢
    • 1970-01-01
    • 2014-04-12
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多