【问题标题】:'MyClass' is unavailable: cannot find Swift declaration for this class - Simulator'MyClass' 不可用:找不到此类的 Swift 声明 - 模拟器
【发布时间】:2018-12-21 06:50:50
【问题描述】:

我有自己的框架,并且支持不同的架构。为了支持模拟器,我在 valid architectures 中使用 x86_64


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

'MyClass(In framework)' 不可用:找不到 Swift 声明 对于这个类

注意:它在设备上运行良好。

【问题讨论】:

  • 这是整个错误信息吗?
  • @Losiowaty:是的
  • @SanjaysinhZala :我在问题中都提到了。
  • 正如您对我的回答所评论的那样,即使完成上述步骤,错误仍然存​​在,您能否添加您使用哪个 MacOS、设备和模拟器来开发您的目标(依赖)项目。理想情况下,如果您可以在某处共享框架文件和/或代码,以便我可以在我的机器上检查它。

标签: ios xcode ios-frameworks


【解决方案1】:

如果我没记错的话,因为第 6 版 Xcode 不支持所谓的“通用”框架(包含 arm-family 和 x86_64/i386) 架构的框架。所以现在当你构建一个框架 Xcode 将为 iphoneos 和 iphonesimulator 创建两个单独的包(您可以在派生数据文件夹中的相应文件夹下找到它们)。这些框架将包含的架构取决于 ARCHS 变量。默认情况下,它设置为 $ARCHS_STANDARD,这因平台而异。您可以使用此设置,混合您真正需要的架构,但如果这些架构不兼容,Xcode 将在构建时失败(大概x86_64arm-family 架构被认为是不兼容的)。

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

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

这没什么特别的,只需转到您的目标构建设置并确保“仅构建活动架构”(ONLY_ACTIVE_ARCH)设置为NO,并为“有效架构“(VALID_ARCHS,你已经这样做了):

现在构建你的框架,在 Xcode 的 Product 组下找到 bundle 文件,然后在 Finder 中打开它:

您应该找到两个文件夹,每个文件夹对应一组架构:

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

现在进入Debug-iphoneos文件夹,从那里复制框架并将其粘贴到其他地方,例如在父文件夹中:

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

$ lipo -create -output 'MyFramework' 'Debug-iphoneos/MyFramework.framework/MyFramework' 'Debug-iphonesimulators/MyFramework.framework/MyFramework'

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

您的框架很可能在MyFramework.framework/Modules/MyFramework.swiftmodule 之类的文件夹下具有架构切片。我们的通用框架应该对所有支持的架构都有切片。你应该已经有arm 切片,因为我们从Debug-iphoneos 文件夹中复制了我们的框架,所以只需为Debug-iphonesimulator 找到相同的文件夹并将文件从文件夹复制到目标框架的文件夹。您现在应该让这个文件夹看起来像这样:

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

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

如果您尝试将应用程序与通用框架一起提交,它将是automatically rejected。因此,在提交之前,您只需要一一提取设备的架构,然后使用 lipo 将它们合并到一个框架中:

$lipo -extract 'arm' 'MyFramework.framework/MyFramework' -output 'MyFramework-arm'
$lipo -extract 'arm64' 'MyFramework.framework/MyFramework' -output 'MyFramework-arm64'
$lipo -create -output 'MyFramework' 'MyFramework-arm' 'MyFramework-arm64'

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

附言

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

【讨论】:

  • 我面临的第一个问题是设置支持设备和模拟器的架构。我如何涵盖所有架构?
  • @Nitish 这篇文章没有回答这个问题吗?您基本上需要单独构建,然后使用 lipo 合并它们
  • 为模拟器执行此操作时构建失败。
  • 它说 - MyClass 不可用。
  • @Nitish 所以,你的意思是这个框架不能被构建,而不是一个依赖它的项目,对吧?如果是这样,那么您最好编辑您的问题,因为基于它我得出了错误的结论。
【解决方案2】:

我看到了两种可能的选择:

  1. 您的设备和模拟器使用不同的 iOS 版本,并且您的框架使用的是最新 iOS 版本中的某些内容(另外,我看到您已将“仅构建活动架构”选项切换为“否”。尝试切换它返回“是”并进行干净的构建。编译器可能会发现问题,但这取决于您如何将框架链接到应用程序)。;
  2. 您的framework 专为特定设备构建。尝试切换到“框架”目标,将构建目标切换到“通用 iOS 设备”,并为“框架”和应用程序进行干净的构建。

此外,如果您更新问题并简要说明如何链接您的框架(通过工作区/通过二进制/通过 CocoaPods/等),这将有所帮助。 通常,这些问题是由一些愚蠢的事情引起的,你应该检查所有的理论,甚至一见倾心或误导:)

【讨论】:

    猜你喜欢
    • 2016-05-03
    • 2015-11-25
    • 2015-07-03
    • 1970-01-01
    • 2015-12-18
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多