将 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 框架。