我有我的框架,并且正在支持不同的体系结构。为了支持模拟器,我在有效架构中使用 x86_64 。
但是当我在应用程序中使用框架时,在模拟器上运行应用程序时出现错误:
'MyClass(In framework)'不可用:找不到Swift声明 此类
注意:在设备上运行正常。
答案 0 :(得分:2)
如果我的记忆正确,那么第6版Xcode不支持所谓的“通用”框架(包含arm
系列和x86_64
/ {{1}的体系结构的框架}。因此,当您构建框架时,Xcode将为iphoneos和iphonesimulator制作两个单独的捆绑包(您可以在派生数据文件夹中的相应文件夹下找到它们)。这些框架的体系结构将取决于ARCHS
变量。默认设置为$ARCHS_STANDARD
,因平台而异。您可以使用此设置,混合您真正需要的架构,但是如果这些架构不兼容(大概是i386)
和{ {1}}-家庭架构被认为是不兼容的。
要克服此限制,您实际上必须自己做一些“艰苦的工作”,并手动“合并”用于模拟器和设备的框架包。
这里没什么花哨的,只需转到目标构建设置并确保将“ 仅构建活动体系结构”(ONLY_ACTIVE_ARCH
)设置为x86_64
并添加所有必需项“ 有效架构”的架构(VALID_ARCHS
,您已经做到了):
现在构建您的框架,在Xcode的“产品”组下找到捆绑文件,然后在Finder中打开它:
您应该找到两个文件夹,每组体系结构一个文件夹:
现在进入arm
文件夹,从那里复制框架并将其粘贴到其他位置,例如在父文件夹中:
不久后它将包含我们的通用框架。为此,我们首先需要使用lipo
工具创建通用动态库。打开终端,导航到您现在所在的文件夹(带有复制的框架文件),然后键入以下内容:
NO
如果您不在派生数据文件夹中,那么框架库的路径当然会有所不同。该命令将产生包含这两种体系结构的新通用库。现在,只需将其拖放到您的框架包中并替换现有的框架包即可。
您的框架可能在Debug-iphoneos
之类的文件夹下具有体系结构片。我们的通用框架应包含所有受支持体系结构的切片。由于我们已经从$ lipo -create -output 'MyFramework' 'Debug-iphoneos/MyFramework.framework/MyFramework' 'Debug-iphonesimulators/MyFramework.framework/MyFramework'
文件夹复制了框架,因此您应该已经有MyFramework.framework/Modules/MyFramework.swiftmodule
切片,因此只需为arm
找到相同的文件夹,然后将文件从该文件夹复制到目标框架的文件夹即可。现在,您应该使该文件夹看起来像这样:
就是这样!现在,您有了一个通用框架,该框架应该可以在iOS模拟器和iOS设备上正常工作。
如果您尝试与通用框架一起提交申请,它将为automatically rejected。因此,在提交之前,您只需要一个一个地提取设备的体系结构,然后使用Debug-iphoneos
将它们合并为一个框架:
Debug-iphonesimulator
然后将其复制到您的框架中并删除多余的片。
希望它会有所帮助,但是这是一个众所周知的问题,并且互联网上已经有很多解决方案。我建议您使用诸如“创建胖/通用框架iOS”之类的术语进行搜索,并且我相信您会找到很多可以为您完成所有这些工作的脚本。 Here是我认为最有帮助的人。
答案 1 :(得分:0)
我看到两个可能的选择:
framework
是为特定设备构建的。尝试切换到“框架”目标,将构建的目标位置切换到“通用iOS设备”,并为“框架”和应用进行干净的构建。此外,如果您使用有关如何链接框架的简短描述来更新问题(通过工作区/通过二进制文件/通过CocoaPods等),也将有所帮助。 通常,此类问题是由一些愚蠢的事情引起的,因此您应该检查所有理论,甚至是一见倾心或引起误解:)