Swift 设备框架构建失败但模拟器失败

Swift Framework build fails for device but not for simulator

知道为什么模拟器的构建会成功而不是设备吗?

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

我遇到 Use of unresolved identifier 个错误。

听起来您构建的框架是针对模拟器而非设备的。当 link 用户尝试 link 设备的应用程序时,它找不到为该设备构建的框架。

以下两种方法。

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

的目录中

使用这种方法,您还需要将框架添加到应用的复制文件构建阶段,将目标指定为框架。

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

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

关于嵌入框架以及其他有用的框架相关信息。完成此操作的一种简便方法是转到应用程序目标的“常规”选项卡并在“嵌入式​​二进制文件”部分添加框架。

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

你应该做一个胖库: 要制作胖库,请逐步执行这些操作:

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

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

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

4 - 使用以下命令将两个二进制文件组合成一个 fat 二进制文件(确保您在桌面上执行 运行 此命令)。

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

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

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

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

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

9 - 来自文件夹:

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

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

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

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

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