如果我没记错的话,因为第 6 版 Xcode 不支持所谓的“通用”框架(包含 arm-family 和 x86_64/i386) 架构的框架。所以现在当你构建一个框架 Xcode 将为 iphoneos 和 iphonesimulator 创建两个单独的包(您可以在派生数据文件夹中的相应文件夹下找到它们)。这些框架将包含的架构取决于 ARCHS 变量。默认情况下,它设置为 $ARCHS_STANDARD,这因平台而异。您可以使用此设置,混合您真正需要的架构,但如果这些架构不兼容,Xcode 将在构建时失败(大概x86_64 和arm-family 架构被认为是不兼容的)。
要克服这个限制,您实际上必须自己做一些“艰苦的工作”并手动“合并”模拟器和设备的框架包。
1。为 iOS 设备和模拟器构建框架
这没什么特别的,只需转到您的目标构建设置并确保“仅构建活动架构”(ONLY_ACTIVE_ARCH)设置为NO,并为“有效架构“(VALID_ARCHS,你已经这样做了):
现在构建你的框架,在 Xcode 的 Product 组下找到 bundle 文件,然后在 Finder 中打开它:
您应该找到两个文件夹,每个文件夹对应一组架构:
2。将两个框架合并为一个
现在进入Debug-iphoneos文件夹,从那里复制框架并将其粘贴到其他地方,例如在父文件夹中:
它将在短时间内包含我们的通用框架。为此,我们首先需要使用lipo 工具创建通用动态库。打开终端,导航到您现在所在的文件夹(使用复制的框架文件)并键入以下内容:
$ lipo -create -output 'MyFramework' 'Debug-iphoneos/MyFramework.framework/MyFramework' 'Debug-iphonesimulators/MyFramework.framework/MyFramework'
如果您不在派生数据文件夹中,您的框架库路径当然会有所不同。此命令将生成包含两组体系结构的新通用库。现在只需将其拖放到您的框架包中并替换现有的。
您的框架很可能在MyFramework.framework/Modules/MyFramework.swiftmodule 之类的文件夹下具有架构切片。我们的通用框架应该对所有支持的架构都有切片。你应该已经有arm 切片,因为我们从Debug-iphoneos 文件夹中复制了我们的框架,所以只需为Debug-iphonesimulator 找到相同的文件夹并将文件从文件夹复制到目标框架的文件夹。您现在应该让这个文件夹看起来像这样:
就是这样!现在您有了一个通用框架,应该可以在 iOS 模拟器和 iOS 设备上正常工作。
3。提交到 Appstore 时对你的框架进行切片
如果您尝试将应用程序与通用框架一起提交,它将是automatically rejected。因此,在提交之前,您只需要一一提取设备的架构,然后使用 lipo 将它们合并到一个框架中:
$lipo -extract 'arm' 'MyFramework.framework/MyFramework' -output 'MyFramework-arm'
$lipo -extract 'arm64' 'MyFramework.framework/MyFramework' -output 'MyFramework-arm64'
$lipo -create -output 'MyFramework' 'MyFramework-arm' 'MyFramework-arm64'
然后将其复制到您的框架中并删除多余的切片。
附言
希望它有所帮助,但这是一个众所周知的问题,互联网上已经有很多解决方案。我建议您搜索诸如“创建胖/通用框架 iOS”之类的术语,我相信您会发现很多工作脚本可以为您完成所有这些工作。 Here 是我认为最有帮助的一个。