Xcode11 Swift5 框架不包含模拟器的头文件,仅适用于 arm64 和 armv7a

Posted

技术标签:

【中文标题】Xcode11 Swift5 框架不包含模拟器的头文件,仅适用于 arm64 和 armv7a【英文标题】:Xcode11 Swift5 framework does not contain header for simulators, only for arm64 and armv7a 【发布时间】:2019-10-09 04:59:04 【问题描述】:

。 因此,我无法使用该框架在模拟器 11.x 和 12.x 模拟器上运行。

检查 Swift5 框架标头显示以下结构:

#if 0
#elif defined(__arm64__) && __arm64__
// Generated by Apple Swift version 5.1 (swiftlang-1100.0.270.13 clang-1100.0.33.7)

....
....
....

#elif defined(__ARM_ARCH_7A__) && __ARM_ARCH_7A__
// Generated by Apple Swift version 5.1 (swiftlang-1100.0.270.13 clang-1100.0.33.7)

....
....
....

#endif

从上面可以看出,该框架没有与模拟器架构匹配的头文件。

如何将模拟器头文件打包到框架中?

【问题讨论】:

XCode 构建您的框架取决于您选择的设备,您必须将模拟器和设备切片组合成一个胖框架才能使其适用于两者 【参考方案1】:

标头是在构建过程中生成的。我假设您尝试使用使用 lipo 创建的胖框架。

在构建期间,您会为每个生成 Header、Info.plist、模块和二进制文件。

因此,在合并模拟器文件和设备文件的步骤中,您可以创建一个头文件,为模拟器和设备重新组合头文件。 不要忘记为模拟器添加if,否则无法编译。 sh 脚本:

# if use only with simulator
echo '#if TARGET_OS_SIMULATOR' > build/arch/universal/Framework.framework/Headers/Framework-Swift.h

# simulator header 
cat build/arch/x86/Framework.framework/Headers/Framework-Swift.h >> build/arch/universal/Framework.framework/Headers/Framework-Swift.h

# end of if
echo '#endif' >> build/arch/universal/Framework.framework/Headers/Framework-Swift.h

# device header
cat build/arch/arm/Framework.framework/Headers/Framework-Swift.h >> build/arch/universal/Framework.framework/Headers/Framework-Swift.h

要回答您的问题,您只需连接两者并添加一个 if 来为每种情况选择正确的。

【讨论】:

你能用旁白和截图解释一下步骤吗

以上是关于Xcode11 Swift5 框架不包含模拟器的头文件,仅适用于 arm64 和 armv7a的主要内容,如果未能解决你的问题,请参考以下文章

Swift 5 - 模拟器以白屏启动 - 仪器

Swift 5 (Xcode 11 Betas 5 & 6) - 如何写入 JSON 文件?

当我在 Xcode 11 中将 swift 4.2 转换为 swift 5 时继续加载

框架包含不受支持的架构 Xcode 8

不能在带有 Xcode 11 包管理器的 Swift 包中包含 C 文件

将框架添加到 Xcode 项目