'MyClass'不可用:找不到此类的Swift声明-Simulator

时间:2018-12-21 06:50:51

标签: ios xcode ios-frameworks

我有我的框架,并且正在支持不同的体系结构。为了支持模拟器,我在有效架构中使用 x86_64


enter image description here

但是当我在应用程序中使用框架时,在模拟器上运行应用程序时出现错误:

  

'MyClass(In framework)'不可用:找不到Swift声明   此类

注意:在设备上运行正常。

2 个答案:

答案 0 :(得分:2)

如果我的记忆正确,那么第6版Xcode不支持所谓的“通用”框架(包含arm系列和x86_64 / {{1}的体系结构的框架}。因此,当您构建框架时,Xcode将为iphoneos和iphonesimulator制作两个单独的捆绑包(您可以在派生数据文件夹中的相应文件夹下找到它们)。这些框架的体系结构将取决于ARCHS变量。默认设置为$ARCHS_STANDARD,因平台而异。您可以使用此设置,混合您真正需要的架构,但是如果这些架构不兼容(大概是i386)和{ {1}}-家庭架构被认为是不兼容的。

要克服此限制,您实际上必须自己做一些“艰苦的工作”,并手动“合并”用于模拟器和设备的框架包。

1。为iOS设备和模拟器构建框架

这里没什么花哨的,只需转到目标构建设置并确保将“ 仅构建活动体系结构”(ONLY_ACTIVE_ARCH)设置为x86_64并添加所有必需项“ 有效架构”的架构(VALID_ARCHS,您已经做到了):

Build settings

现在构建您的框架,在Xcode的“产品”组下找到捆绑文件,然后在Finder中打开它:

Open build folder

您应该找到两个文件夹,每组体系结构一个文件夹:

Build folder

2。将两个框架合并为一个

现在进入arm文件夹,从那里复制框架并将其粘贴到其他位置,例如在父文件夹中:

Framework in parent folder

不久后它将包含我们的通用框架。为此,我们首先需要使用lipo工具创建通用动态库。打开终端,导航到您现在所在的文件夹(带有复制的框架文件),然后键入以下内容:

NO

如果您不在派生数据文件夹中,那么框架库的路径当然会有所不同。该命令将产生包含这两种体系结构的新通用库。现在,只需将其拖放到您的框架包中并替换现有的框架包即可。

您的框架可能在Debug-iphoneos之类的文件夹下具有体系结构片。我们的通用框架应包含所有受支持体系结构的切片。由于我们已经从$ lipo -create -output 'MyFramework' 'Debug-iphoneos/MyFramework.framework/MyFramework' 'Debug-iphonesimulators/MyFramework.framework/MyFramework' 文件夹复制了框架,因此您应该已经有MyFramework.framework/Modules/MyFramework.swiftmodule切片,因此只需为arm找到相同的文件夹,然后将文件从该文件夹复制到目标框架的文件夹即可。现在,您应该使该文件夹看起来像这样:

Framework slices

就是这样!现在,您有了一个通用框架,该框架应该可以在iOS模拟器和iOS设备上正常工作。

3。提交到Appstore时对框架进行切片

如果您尝试与通用框架一起提交申请,它将为automatically rejected。因此,在提交之前,您只需要一个一个地提取设备的体系结构,然后使用Debug-iphoneos将它们合并为一个框架:

Debug-iphonesimulator

然后将其复制到您的框架中并删除多余的片。

P.S。

希望它会有所帮助,但是这是一个众所周知的问题,并且互联网上已经有很多解决方案。我建议您使用诸如“创建胖/通用框架iOS”之类的术语进行搜索,并且我相信您会找到很多可以为您完成所有这些工作的脚本。 Here是我认为最有帮助的人。

答案 1 :(得分:0)

我看到两个可能的选择:

  1. 您的设备和模拟器使用不同的iOS版本,并且您的框架使用的是最新iOS版本中的内容(此外,我看到您已将“仅构建Active Architecture”选项切换为“否”。请尝试将其切换回到“是”并进行清晰的构建。编译器可能会发现问题,但这取决于您将框架链接到应用程序的方式。
  2. 您的framework是为特定设备构建的。尝试切换到“框架”目标,将构建的目标位置切换到“通用iOS设备”,并为“框架”和应用进行干净的构建。

此外,如果您使用有关如何链接框架的简短描述来更新问题(通过工作区/通过二进制文件/通过CocoaPods等),也将有所帮助。 通常,此类问题是由一些愚蠢的事情引起的,因此您应该检查所有理论,甚至是一见倾心或引起误解:)