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 与框架。参见
关于嵌入框架以及其他有用的框架相关信息。完成此操作的一种简便方法是转到应用程序目标的“常规”选项卡并在“嵌入式二进制文件”部分添加框架。
或者,如果您在创建应用程序后创建框架,您可以要求 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 中的“嵌入式二进制文件”选项包含此框架。在你的文件中导入模块,你就可以成功编译它。
知道为什么模拟器的构建会成功而不是设备吗?
我创建了一个 Cocoa 框架,并且能够将它添加到一个新的单页应用程序项目中,并调用框架中定义的方法。只要我选择了一个模拟器作为构建目标而不是设备,该项目就会构建。 运行我没试过,只能建。我正在使用 Swift 3 和 XCode 8.1.
我遇到 Use of unresolved identifier
个错误。
听起来您构建的框架是针对模拟器而非设备的。当 link 用户尝试 link 设备的应用程序时,它找不到为该设备构建的框架。
以下两种方法。
1) 构建框架时,设置适合设备的active scheme(Xcode左上区域)。然后,在为设备构建应用程序之前,转到应用程序的构建设置并将框架的位置添加到框架搜索路径。确保选择正确的二进制文件!例如,在为 iOS 模拟器构建时,框架的调试二进制文件将位于名为 Build/Products/Debug-iphonesimulator.
的目录中使用这种方法,您还需要将框架添加到应用的复制文件构建阶段,将目标指定为框架。
2) 将框架嵌入到应用程序中,使其成为应用程序的依赖项,并在应用程序的构建阶段中将应用程序设置为 link 与框架。参见
关于嵌入框架以及其他有用的框架相关信息。完成此操作的一种简便方法是转到应用程序目标的“常规”选项卡并在“嵌入式二进制文件”部分添加框架。
或者,如果您在创建应用程序后创建框架,您可以要求 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 中的“嵌入式二进制文件”选项包含此框架。在你的文件中导入模块,你就可以成功编译它。