我正在开发一个 iOS 项目。我使用的框架(UnityFramework)仅适用于设备,不适用于模拟器。我想在模拟器上运行时排除框架以便于测试,否则应用程序将无法编译。
我已按照this StackOverflow post(似乎已过时)和this Apple文档的说明弱链接框架,以便在构建模拟器时不包含它,但我仍然遇到相同的错误为模拟器构建时:找不到框架。
我不确定我是否遗漏了一些需要从模拟器构建中排除此框架的内容,或者我的配置是否有问题。我尝试在“其他链接器标志”中使用 -weak_framework 和 -ObjC -weak_framework。我正在使用 Xcode 13.3。
我的构建设置:
框架、库和嵌入内容:UnityFramework.framework - 嵌入和签名
构建设置 - 其他链接器标志 - 全部标有 -weak_framework UnityFramework
构建阶段 - 将二进制文件与库链接 - UnityFramework.framework - 可选
这是我收到的错误的片段:
Ld .../Library/Developer/Xcode/DerivedData/app-gygzddvoumbadmatpojfllhgdkag/Build/Products/Debug-iphonesimulator/AppDevelopment.app/AppDevelopment 正常(在项目“App”的目标“AppDevelopment”中) cd .../项目/应用程序文件夹
-Xlinker .../Library/Developer/Xcode/DerivedData/app-gygzddvoumbadmatpojfllhgdkag/Build/Intermediates.noindex/app.build/Debug-iphonesimulator/appDevelopment.build/Objects-normal/x86_64/appDevelopment.swiftmodule -weak_framework UnityFramework - Xlinker -sectcreate -Xlinker __TEXT -Xlinker
ld:找不到 UnityFramework 框架
假设您的框架名称是
YourFramework
:
#if !targetEnvironment(simulator) //notice the not operator (!)
import YourFramework //YourFramework will be imported only when not on simulator
#endif
它也可能值得检查
#if canImport(YourFramework)
几小时后我发现了下一个:
Unknown argument: '-weak_framework <name>'
。您应该将其分成两行:-weak_framework
和下一个"<name>"
。我仍然没有找到如何嵌入arm64框架并排除模拟器的解决方案。
通过以下方式解决了我的问题:
其次,xcode 在衍生数据中寻找我的框架。我将框架复制到项目文件夹,然后通过手动将其拖入将其添加到“框架”中。
问题似乎是xcode无法在模拟器条件下构建我的框架,但它仍然需要链接它,因此它无法“找到”构建的框架。通过制作框架的副本并将其保存在项目目录中,它将不再在派生数据中查找它。可能有更好的方法通过构建脚本来完成此操作。
我现在可以在模拟器和设备上运行应用程序,并使用 #if targetEnvironment(simulator) 属性,我可以在设备上很好地访问框架的功能,并将它们留在模拟器上。
我现在在构建模拟器时收到以下警告,该警告之前没有出现:
为 iOS 模拟器构建,但链接和嵌入式框架“UnityFramework.framework”是为 iOS 构建的。