首页 > 解决方案 > Xcode11 Swift5 框架不包含模拟器的头文件,仅适用于 arm64 和 armv7a

问题描述

Xcode11 Swift5 框架不包含模拟器的头文件,仅适用于 arm64 和 armv7a。因此,我无法使用该框架在模拟器 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

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

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

标签: iosxcodeframeworksxcode11swift5

解决方案


标头是在构建期间生成的。我假设您尝试使用使用 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 来为每种情况选择正确的。


推荐阅读