iOS通用框架,包含iphoneos和iphonesimulator架构。

7
xcodebuild可以使用iphoneosiphonesimulator SDK构建项目,但不能同时使用两种SDK。因此,为了生成一个包含armv7 arm64i386 x86_64结构的框架,我必须运行xcodebuild两次,然后使用lipo将所有结构合并为1个通用二进制文件。我看到商业框架也这样做,但它会导致一个错误的info.plist文件,因为它有一个字段CFBundleSupportedPlatforms,所有迹象都表明它只包含1个值,例如:CFBundleSupportedPlatforms = ( "iPhoneSimulator" )
似乎不应该以这种方式使用lipo,因为它没有得到xcodebuild的官方支持。是否有更好的方法来构建一个包含所有结构的框架?
1个回答

5
我理解您的问题,但我有些困惑,为什么您要在单个.framework 中不必要地膨胀模拟器专用的i386和x84_64切片,这些只与您的开发构建相关。您是否想要向其他开发人员分发框架并使其在模拟器和设备上运行?
如果是这样,您使用lipo将设备的薄二进制文件合并或将模拟器的薄二进制文件合并是正确的方法,但不应该尝试生成一个单一的设备和模拟器框架。苹果自己使用SDK和框架作为指南。在Xcode中,有两个不同的平台SDK——iPhoneOS.platform和iPhoneSimulator.platform,它们包含仅针对相关目标体系结构的切片的SDK:

Xcode's Platform Options

你可以深入每个文件夹,发现UIKit框架确实遵循每个平台的思想,并根据使用的SDK有条件地链接:

UIKit Lipo

我猜想您希望拥有一个通用的、支持所有架构的框架,这样使用者就不必根据编译应用程序的方式来更换.framework文件。好消息是,您可以使用条件链接标志来实现这一点,而无需进行文件系统交换!随着人们采用您的库,设置的一部分应该是使用条件链接——在OTHER_LINKER_FLAGS选项中,您可以拥有每个配置(调试、发布、Ad-Hoc等)的构建设置,还可以拥有每个架构或特定SDK的设置。

Other Linker Flags

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

谢谢你详细的回答。你猜对了,我正在考虑将一个框架分发给其他开发人员,但你说的很有道理。不过有一件事,你提到的 iPhoneOS.platformiPhoneSimulator.platform 的路径在 Yosemite 10.10.4,Xcode 6.4 中已经不再存在了,你知道它们可能在哪里吗? - Bob
1
@Bob 看起来你可能是根据 Finder 的截图来判断的;看一眼终端屏幕以获取完整路径。 - Bryan Musial
2
没错,你又说对了,感谢你的所有帮助。我应该提到像Crashlytics、Shinobi Charts和PSPDFKit这样的商业开发者正在将两个平台打包成一个二进制和框架,这与苹果自己的框架相反。 - Bob
5
那么链接器标志的设置应该填什么?我想我需要编译两个版本的库:lib-sim.framework和lib-device.framework,并将它们都复制到我的客户端项目中?但是构建阶段的"链接二进制文件库"部分不允许每个sdk设置,那么我不明白如何在模拟器和设备上使用不同版本的库? - Brynjar
2
我也和@Brynjar一样感到困惑。我不确定在适当的情况下应该将什么内容放入链接器标志中以排除每个框架。 - J.beenie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接