返回

Xcode 16 归档 OpenSSL Asset Validation 失败解决方案

IOS

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。

操作步骤:

  1. 在 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 可以优化应用大小和性能。

操作步骤:

  1. 打开项目的 Build Settings
  2. 搜索 Enable Bitcode
  3. Enable Bitcode 设置为 No

安全建议

  • 保持 OpenSSL-Universal 库更新到最新版本,以获取最新的安全补丁和功能更新。
  • 定期审核项目依赖,移除不必要的库,以减少潜在的安全风险。
  • 关注 OpenSSL 的官方安全公告,及时处理潜在的漏洞。

通过以上方法,可以有效解决 Xcode 16 归档时 OpenSSL Asset Validation 失败的问题,并确保应用的安全性和稳定性。 选择 bitcode_strip 的方案更加灵活, 既解决了问题, 也保留了 Bitcode 带来的好处. 记住根据你的实际情况选择合适的解决方案。