iOS 具有 iphoneos 和 iphonesimulator 架构的通用框架

iOS universal framework with iphoneos and iphonesimulator architectures

xcodebuild 可以构建一个 sdk 设置为 iphoneosiphonesimulator 但不能同时设置的项目,因此为了生成包含 armv7 arm64i386 x86_64 架构,我必须 运行 xcodebuild 两次,然后使用 lipo 将所有架构组合成 1 个通用二进制文件。我看到这样做的商业框架,但它导致了一个不正确的 info.plist 文件,因为它有一个字段 CFBundleSupportedPlatforms,并且所有指向它的标志都只包含 1 个值,例如 CFBundleSupportedPlatforms = ( "iPhoneSimulator" )

似乎 lipo 不应该以这种方式使用,因为 xcodebuld 未正式支持它。有没有更好的方法来构建一个包含所有架构的框架?

我回答了这个问题,但我想我有点困惑为什么你要用仅与模拟器相关的 i386 和 x84_64 切片不必要地膨胀一个 .framework开发构建。您是否偶然想将一个框架分发给其他开发人员并想让它在模拟器和设备上运行?

如果是这样,那么您使用 lipo 将设备的精简二进制文件连接在一起或将模拟器的精简二进制文件连接在一起是正确的,但不应尝试生成一个设备和模拟器框架。 Apple 自己对 SDK 和框架的使用在此作为指南。在 Xcode 中,有两个不同的平台 SDK -- iPhoneOS.platform 和 iPhoneSimulator.platform,它们包含仅包含相关目标架构切片的 SDK:

您可以深入了解这些文件夹中的每一个,发现 UIKit 框架确实遵循每个平台的想法,并且根据正在使用的 SDK 有条件地链接:

我进一步猜测您希望拥有一个通用的、全架构的框架,以便开发人员不必记住根据他们编译应用程序的方式将一个 .framework 文件换成另一个。好消息是您可以使用条件链接标志来影响这一点,而无需进行文件系统交换!

当人们采用您的库时,设置的一部分应该是使用条件链接——在 OTHER_LINKER_FLAGS 选项中,您可以根据配置(调试、发布、临时等)构建设置,也可以有每个架构或每个 SDK 的特定设置:

要访问这些特定于 SDK 的设置,您需要单击要自定义框架链接的每个构建配置旁边的 +。然后,您可以 select 从下拉列表中选择合适的 SDK,并为两个目标框架中的每一个添加链接器标志。