Swift Framework构建对于设备而言是失败的,但对于模拟器则不然

时间:2016-11-09 21:47:26

标签: swift3 xcode8 ios-frameworks

为什么构建会为模拟器而不是设备成功的任何想法?

我创建了一个Cocoa框架,并能够将其添加到新的单页面应用程序项目中,并调用框架中定义的方法。只要我选择了模拟器作为构建目标而不是设备,项目就会构建。我没有尝试过运行它,只是建设。我正在使用Swift 3和XCode 8.1。

我收到Use of unresolved identifier次错误。

2 个答案:

答案 0 :(得分:3)

听起来你为模拟器而不是设备构建了框架。当链接器尝试链接设备的应用程序时,它没有找到为该设备构建的框架。

其中两种方法如下:

1)构建框架时,设置适合设备的活动方案(Xcode中的左上区域)。然后,在构建设备的应用程序之前,请转到应用程序的“构建设置”,并将框架的位置添加到“框架搜索路径”。确保选择正确的二进制文件!例如,在为iOS模拟器构建时,框架的调试二进制文件将位于名为Build / Products / Debug-iphonesimulator的目录中。

使用此方法,您还需要将框架添加到应用程序的“复制文件”构建阶段,并将“目标”指定为“框架”。

2)将框架嵌入到应用程序中,使其成为应用程序的依赖项,并将应用程序设置为与应用程序的构建阶段中的框架链接。见

https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPFrameworks/Tasks/CreatingFrameworks.html

关于嵌入框架和其他有用的框架相关信息。实现此目的的一种便捷方法是转到应用程序目标的“常规”选项卡,并在“嵌入式​​二进制文件”部分中添加框架。

或者,如果您在创建应用程序后创建框架,则可以让Xcode将框架嵌入到应用程序中。

答案 1 :(得分:0)

您应该制作一个胖图书馆: 要制作脂肪库,请按以下步骤操作:

1-为iOS模拟器构建您的Freamework目标,并从桌面上的products文件夹中提取框架。

2-将框架重命名为yourFrameworkName-sim.framework,以便以后可以区分。

3-对iOS设备重复步骤1和2。您可以选择“通用iOS设备”。不要忘记将框架重命名为yourFrameworkName-dev.framework。

4-使用以下命令将两个二进制文件组合到一个单独的二进制文件中(运行此命令时请确保您在桌面上)。

$lipo -create ./yourFrameworkName-sim.framework/yourFrameworkName ./yourFrameworkName-dev.framework/yourFrameworkName -output ./yourFrameworkName

5-复制在上述步骤中创建的yourFramework二进制文件,并将其替换为yourFrameworkName-dev.framework文件夹中的二进制文件。

6-打开同一文件夹中包含的“ Info.plist”文件。

7-在“ CFBundleSupportedPlatforms”数组中添加“ iPhoneSimulator”字符串。

8-最终的plist文件如下所示:

enter image description here

9-从文件夹:

yourFrameworkName-sim.framework/Modules/yourFrameworkName.swiftmodule/

复制“ x86_64.swiftdoc”和“ x86_64.swiftmodule”并将其粘贴到

yourFrameworkName-dev.framework/Modules/yourFrameworkName.swiftmodule/

10-通过执行上述步骤,您已经将yourFrameworkName-dev.framework从仅设备转换为通用的胖框架。将其重命名为yourFrameworkName.framework。

11-通过Xcode中的“嵌入式二进制文件”选项包含此框架。将模块导入文件中,便可以成功编译它。