Xcode 16 归档 OpenSSL Asset Validation 失败解决方案
2024-11-15 06:58:19
Xcode 16 归档时 OpenSSL Asset Validation 失败
在使用 Xcode 16 归档 iOS 应用时,如果项目使用了 OpenSSL-Universal 库,可能会遇到 "Asset validation failed" 的错误,提示 OpenSSL framework 中包含 bitcode。 这个问题通常出现在升级 Xcode 16 或更新 OpenSSL-Universal 库之后。错误信息通常类似于: Invalid Executable. The executable 'your.app/Frameworks/OpenSSL.framework/OpenSSL' contains bitcode. (ID:XXXX)
。
问题分析
Xcode 16 默认开启了新的代码签名机制,对于包含 bitcode 的库文件有更严格的校验。 OpenSSL-Universal 提供了各种架构的 OpenSSL 库,其中包含 bitcode 信息。这与 Xcode 16 的校验机制冲突,导致了 Asset validation 的失败。
解决方案
解决这个问题的核心思路是去除 OpenSSL framework 中的 bitcode 信息。以下提供几种常用的解决方案:
1. 使用 bitcode_strip
去除 Bitcode
这是最直接的解决方案。利用 Xcode 提供的 bitcode_strip
工具,可以移除 framework 中的 bitcode。
操作步骤:
- 在 Podfile 的
post_install
hook 中添加以下代码:
post_install do |installer|
# ...其他 post_install 逻辑...
bitcode_strip_path = `xcrun --sdk iphoneos --find bitcode_strip`.chomp # iOS 设备
bitcode_strip_simulator_path = `xcrun --sdk iphonesimulator --find bitcode_strip`.chomp # iOS 模拟器
def strip_bitcode(bitcode_strip_path, framework_path)
command = "#{bitcode_strip_path} #{framework_path} -r -o #{framework_path}"
puts "Stripping bitcode: #{command}"
system(command)
end
# 获取 OpenSSL.framework 的路径. 使用 Dir.glob 支持 OpenSSL-Universal 的各种版本路径结构
Dir.glob("Pods/OpenSSL-Universal/Frameworks/**/OpenSSL.framework").each do |framework_path|
strip_bitcode(bitcode_strip_path, framework_path + "/OpenSSL") # 真机架构
# 如果需要支持模拟器,也需要去除模拟器架构的 bitcode
strip_bitcode(bitcode_strip_simulator_path, framework_path + "/OpenSSL") # 模拟器架构
end
end
原理: 这段代码首先获取 bitcode_strip
工具的路径。然后,使用 Dir.glob
查找所有可能的 OpenSSL.framework 路径, 并遍历每个找到的路径, 利用 bitcode_strip
命令去除 framework 中的 bitcode。 注意分别处理了真机和模拟器的架构.
2. 禁用 Bitcode
另一个简单的方案是在项目设置中禁用 bitcode。虽然简单,但不推荐,因为 bitcode 可以优化应用大小和性能。
操作步骤:
- 打开项目的
Build Settings
。 - 搜索
Enable Bitcode
。 - 将
Enable Bitcode
设置为No
。
安全建议
- 保持 OpenSSL-Universal 库更新到最新版本,以获取最新的安全补丁和功能更新。
- 定期审核项目依赖,移除不必要的库,以减少潜在的安全风险。
- 关注 OpenSSL 的官方安全公告,及时处理潜在的漏洞。
通过以上方法,可以有效解决 Xcode 16 归档时 OpenSSL Asset Validation 失败的问题,并确保应用的安全性和稳定性。 选择 bitcode_strip
的方案更加灵活, 既解决了问题, 也保留了 Bitcode 带来的好处. 记住根据你的实际情况选择合适的解决方案。