2014-05-07 15 views
7

Używam framework JavaScriptCore, który był introduced in iOS 7. Moja aplikacja ma docelową wartość wdrożenia: iOS 6.0. Łączę aplikację z JavaScriptCore.framework (domyślnie w trybie wymagany tryb). Nowy JavaScript Objective-C classes (JSContext, JSValue itd.) Nie są oczywiście dostępne, gdy działa na iOS 6, ale nadal mogę użyć zwykłego C API, czyli JSGlobalContextCreate(), JSObjectCallAsFunction() itpDostępność architektury JavaScriptCore w systemie iOS

Jeśli połączyć ramy MultipeerConnectivity który również został wprowadzony w iOS 7 i uruchomić moją aplikację na iOS 6, uzyskać oczekiwaną awarię przy starcie:

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 

Dlaczego moja aplikacja nie upaść z powodu tego samego błędu dyld kiedy odwołują ramy JavaScriptCore?

Odpowiedz

21

Podczas łączenia ramy JavaScriptCore się w iOS 7 rozmieszczenia cel łączy APP do 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) 
    ... 

Podczas łączenia ramy JavaScriptCore się w iOS 6 rozmieszczenia cel łączy APP do 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) 
    ... 

To dlatego, że Ja vaScriptCore ramy ma special symbols że instruować łącznik zmienić jego dylib ścieżki instalacji w zależności od wersji docelowej Wdrożenie:

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 ramy jest dostępny w katalogu PrivateFrameworks w iOS 4.3 do 6.1 więc aplikacja znajdzie go tam przy starcie . IOS 7, PrivateFrameworks/JavaScriptCore.framework jest dowiązaniem symbolicznym do Frameworks/JavaScriptCore.framework tak, że aplikacja może działać zarówno na iOS 6 i 7.

Chociaż nie udokumentowano w dowolnym miejscu, to było wyraźnie celowe posunięcie ze strony Apple, aby dodać wsteczną zgodność z ramami JavaScriptCore. Niestety zespół ds. Walidacji App Store nie otrzymał notatek od zespołu JavaScriptCore i aplikacji łączących framework JavaScriptCore z targetami iOS poniżej 7 will be rejected, ponieważ używają one architektury w katalogu PrivateFrameworks. Proszę duplikować rdar://problem/17076670, jeśli chcesz, aby Apple rozwiązał ten problem.

W międzyczasie można obejść odrzucenie przez usunięcie ramy JavaScriptCore z projektu i stosując następujące inne flagi Linker zamiast (dostosowanie do każdego nieokreślonego błędu symbolu masz)

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

opowiada tę linker, aby dynamicznie rozwiązywać symbole. Ponieważ struktura JavaScriptCore jest zawsze pośrednio ładowana za pośrednictwem UIKit → WebKit → JavaScriptCore, symbole zostaną rozwiązane poprawnie w środowisku wykonawczym, a aplikacja nie powinna zostać odrzucona, ponieważ nie łączy ona bezpośrednio struktury JavaScriptCore.

+1

Nie mogę uwierzyć! – loretoparisi

+0

Założę się, że jest tam również coś wspólnego ze zgodnością z LGPL. – fluffy

+0

Jestem przekonany, że nie ma to nic wspólnego ze zgodnością z LGPL, tylko kwestią niezgodności SDK. – 0xced