gpt4 book ai didi

ios - JavaScriptCore 框架在 iOS 上的可用性

转载 作者:可可西里 更新时间:2023-11-01 03:25:22 24 4
gpt4 key购买 nike

我正在使用 introduced in iOS 7 的 JavaScriptCore 框架.我的应用有一个 iOS 6.0 部署目标。我正在将应用程序与 JavaScriptCore.framework 链接(默认情况下处于必需 模式)。新JavaScript Objective-C classes (JSContextJSValue 等)在 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 错误而崩溃?

最佳答案

将 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 的符号链接(symbolic link),因此应用程序可以在 iOS 6 和 7 上运行。

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

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

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

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

关于ios - JavaScriptCore 框架在 iOS 上的可用性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23514579/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com