2014-05-07 32 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