通用框架:Xcode 无法识别的平台

Posted

技术标签:

【中文标题】通用框架:Xcode 无法识别的平台【英文标题】:Universal framework: platform not recognized by Xcode 【发布时间】:2018-03-24 10:31:35 【问题描述】:

总结

使用lipo 为 iphoneos 和 iphonesimulator 创建通用框架时,链接框架的应用似乎找不到其中一个平台。我不确定 Xcode 如何与通用框架一起工作。

我的设置

我有一个框架的 Xcode 项目和一个应用程序。

我可以为“iphoneos”平台构建我的框架(archs:armv7arm64),并将其链接到我为 iphoneos 构建的应用程序中。

我还可以为“iphonesimulator”平台构建我的框架(archs:i386x86_64),并将其链接到我为 iphonesimulator 构建的应用程序中。

现在,我想用它制作一个通用框架(即,我只想为 iphoneos 和 iphonesimulator 提供一个框架。鉴于我的框架 foo.framework,我会这样做:

cp -r Debug-iphoneos/foo.framework .
rm foo.framework/foo
lipo Debug-iphoneos/foo.framework/foo Debug-iphonesimulator/foo.framework/foo -create -output foo.framework/foo

它导致了一个框架,其中foo 二进制文件具有拱门armv7arm64i386x86_64。但是当将它链接到我的应用程序时,它要么仅适用于 iphoneos,要么仅适用于 iphonesimulator,但不能同时适用。

由于我的应用程序在为模拟器构建和使用模拟器框架时有效,并且在为 iphoneos 和 iphoneos 框架构建时也有效,我相信我的代码很好,所有符号都有效。

当我使用通用框架时,Xcode 似乎没有为这两个平台之一找到任何符号。我认为它可能与 Info.plist 相关(具有“支持的平台”字段并且我不适应通用设置),但完全删除 Info.plist 并不能解决问题。

是否有文档解释 xcode 对通用框架的期望?我知道我需要一个胖二进制文件中的所有 4 个拱门,但没有人提到 Info.plist,而且我没有找到任何解释 Xcode 如何使用通用框架的文档。

【问题讨论】:

【参考方案1】:

我意识到不同的架构实际上有不同的 Swift 子模块,所以它们需要独立复制:

cp -r Debug-iphoneos/foo.framework/Modules/foo.swiftmodule/* <universal_foo.framework>/Modules/foo.swiftmodule/

我假设它们对于所有架构都是相同的,导致其中一些在我的“通用框架”中缺乏,这解释了为什么它们被忽略了。

【讨论】:

以上是关于通用框架:Xcode 无法识别的平台的主要内容,如果未能解决你的问题,请参考以下文章

win10无法识别usb设备怎么办

无法识别的属性“targetFramework”。请注意属性名称区分大小写。

Xcode - presentViewController NSInvalidArgumentException:无法识别的选择器发送到实例

“无法识别的选择器发送到实例”,即使 XCode 说实例是正确的类型

XCode6/Swift:发送到实例的无法识别的选择器

Parse 和 Facebook SDK - 发送到类的无法识别的选择器