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

Bob*_*Bob 6 xcode xcodebuild ios ios-frameworks lipo

xcodebuild可以建立与SDK中设定了一个项目,无论是iphoneosiphonesimulator,但不能同时,所以为了生成包含框架armv7 arm64i386 x86_64体系,我必须跑xcodebuild两次,然后用lipo所有的架构合并为1个通用二进制.我看到这样做的商业框架,但它导致了一个不正确的info.plist文件,因为它有一个字段,CFBundleSupportedPlatforms并且所有符号都指向它只包含1个值,例如CFBundleSupportedPlatforms = ( "iPhoneSimulator" ).

似乎lipo不应该以这种方式使用,因为它没有得到官方的支持xcodebuld.是否有更好的方法来构建包含所有体系结构的框架?

Bry*_*ial 5

我关注了这个问题,但我想我有点困惑,为什么您要.framework使用仅与您的开发版本相关的仅限模拟器的 i386 和 x84_64 切片不必要地膨胀单个切片。您是否希望将框架分发给其他开发人员并希望使其在模拟器和设备上都能运行?

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

Xcode 的平台选项

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

UIKit 锂电池

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

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

其他链接器标志

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

  • @BryanMusial 那么链接器标志设置中有什么?我想我编译了两个版本的 lib:lib-sim.framework 和 lib-device.framework 并将它们都复制到我的客户端项目中?但是然后构建阶段部分“将二进制文件与库链接”不允许每个 sdk 设置,所以我看不到我如何将一个版本用于 sim 而另一个用于设备? (4认同)
  • 是的,你又是对的,谢谢你的帮助。我应该提到,像 Crashlytics、Shinobi Charts 和 PSPDFKit 这样的商业开发者正在将这两个平台打包成 1 个二进制和框架,这与 Apple 自己的框架背道而驰。 (2认同)
  • 我也对与 @Brynjar 相同的事情感到困惑。我不确定链接器标志中包含什么内容以在适当的情况下排除每个框架。 (2认同)