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

时间:2015-07-22 23:12:50

标签: ios xcode xcodebuild ios-frameworks lipo

xcodebuild可以构建一个项目,其中sdk设置为iphoneosiphonesimulator,但不能同时设置为两者,因此为了生成包含armv7 arm64和{{1}的框架我必须运行i386 x86_64两次,然后使用xcodebuild将所有体系结构合并为1个通用二进制文件。我看到商业框架执行此操作但导致错误的lipo文件,因为它有一个字段info.plist,所有符号都指向它只包含1个值,例如CFBundleSupportedPlatforms

似乎CFBundleSupportedPlatforms = ( "iPhoneSimulator" )似乎不能以这种方式使用,因为lipo没有正式支持它。是否有更好的方法来构建包含所有体系结构的框架?

1 个答案:

答案 0 :(得分:4)

我遵循了这个问题,但我想我有点疑惑为什么你想用一个只有模拟器的i386和x84_64切片来实现仅与你的开发版本相关的单个.framework。您是偶然想要将框架分发给其他开发人员并希望它能够在模拟器和设备上运行吗?

如果是这样,您可以使用lipo将设备的瘦二进制文件连接在一起,或者将模拟器的瘦二进制文件连接在一起,但是不应该尝试生成一个设备和模拟器框架。 Apple自己使用SDK和Frameworks作为指南。在Xcode中,有两个不同的平台SDK - iPhoneOS.platform和iPhoneSimulator.platform,其中包含仅包含相关目标体系结构切片的SDK:

Xcode's Platform Options

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

UIKit Lipo

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

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

Other Linker Flags

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