2014-05-07 28 views
7

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

如果我链接MultipeerConnectivity框架,也是在推出iOS的7,我跑我在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 

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

回答

21

当链接具有的iOS 7部署的JavaScriptCore框架靶向应用链接到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) 
    ... 

当链接具有iOS 6的部署的JavaScriptCore框架靶向应用链接到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) 
    ... 

这是因为Ja vaScriptCore框架有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的框架是在PrivateFrameworks目录中的iOS 4.3到6.1可让应用程序发现它有启动。在iOS 7,PrivateFrameworks/JavaScriptCore.framework是一个符号链接Frameworks/JavaScriptCore.framework从而使应用程序可以同时在iOS 6中运行,7

虽然任何地方没有记录,这显然是从苹果刻意向后兼容性添加到JavaScriptCore的框架。但不幸的是,App Store验证团队没有从JavaScriptCore团队和应用链接JavaScriptCore框架和iOS 7以下目标iOS的应用中获得备忘录,因为他们正在使用PrivateFrameworks目录中的框架。如果您想Apple解决此问题,请复制rdar://problem/17076670

在此期间,您可以从您的项目去掉JavaScriptCore的框架,并使用以下其它链接器标记而不是解决办法拒绝(适应你所得到的每个未定义的符号错误)

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

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

+1

不能相信! – loretoparisi

+0

我敢打赌,那里也有LGPL合规问题。 – fluffy

+0

我非常有信心,它与LGPL合规性无关,只是SDK不兼容问题。 – 0xced