一觉醒来,准备打包上传 appstore 的时候,天塌了!!!
苹果一年一度都要给开发者挖几个坑,还要求强制升级 Xcode,升级 Xcode 还要升级 mac 系统,真是明知有坑还非跳不可。我就想说 Xcode 是我用过的最难用的编译器,真是越升级越难用。2025年 Xcode16 的坑我先给大家趟过了,有遇到的童鞋可以参考一下。
问题描述:如果项目中打开了 bitcode 或者某些 sdk 里面用到了bitcode,用 Xcode16 打包提交 appstore 的时候会遇到以下报错。framework contains incomplete bitcode. To compile binaries with complete bitcode, open Xcode and choose Archive in the Product menu。
解决办法:
方案一(治标不治本,不推荐):针对此问题用一个脚本遍历安装包里面所有framework,移除bitcode即可。
第一步、保存以下脚本至桌面,命名为remove_bitcode.sh。
#!/bin/bash
# 检查输入参数
if [ $# -ne 1 ]; then
echo "Usage: $0 <xcarchive_path>"
exit 1
fi
ARCHIVE_PATH="$1"
# 验证xcarchive路径是否存在
if [ ! -d "$ARCHIVE_PATH" ]; then
echo "错误:指定的xcarchive路径不存在 - $ARCHIVE_PATH"
exit 1
fi
# 检查必要工具
command -v otool >/dev/null 2>&1 || { echo "错误:请先安装Xcode命令行工具"; exit 1; }
command -v xcrun >/dev/null 2>&1 || { echo "错误:找不到xcrun命令"; exit 1; }
# 主处理逻辑
find "$ARCHIVE_PATH" -name "*.framework" | while read framework; do
# 获取framework核心可执行文件路径
framework_name=$(basename "$framework" .framework)
executable="$framework/$framework_name"
if [ ! -f "$executable" ]; then
echo "警告:跳过无效的framework - $framework"
continue
fi
echo "正在检测: $executable"
# 检测Bitcode存在性
if otool -l "$executable" | grep -q "segname __LLVM"; then
echo "检测到Bitcode,正在处理..."
# 创建临时文件
tmp_file=$(mktemp)
# 移除Bitcode并处理结果
if xcrun bitcode_strip -r "$executable" -o "$tmp_file"; then
# 替换原始文件并保持权限
mv -f "$tmp_file" "$executable"
chmod +x "$executable"
echo "成功移除Bitcode"
else
echo "错误:Bitcode移除失败"
rm -f "$tmp_file"
exit 1
fi
else
echo "未检测到Bitcode"
fi
done
echo "操作完成"
exit 0
第二步、赋予脚本执行权限:chmod +x remove_bitcode.sh。
第三步、打开“Organizer”窗口(Window -> Organizer”),找到刚才打包的文件,右键鼠标右键 Show Finder,找到后缀.xcarchive文件。
第四步、执行脚本:./remove_bitcode.sh /path/to/your.xcarchive ,移除安装包里面 framework 的 bitcode。
第五步、回到Organizer继续上传即可。
方案二(推荐):在 podfile 中添加脚本代码。
第一步、在Podfile中 post_install do |installer|添加以下脚本代码。
bitcode_strip_path = `xcrun --find bitcode_strip`.chop!
def strip_bitcode_from_framework(bitcode_strip_path, framework_relative_path)
framework_path = File.join(Dir.pwd, framework_relative_path)
command = "#{bitcode_strip_path} #{framework_path} -r -o #{framework_path}"
puts "Stripping bitcode: #{command}"
system(command)
end
framework_paths = [
"Pods/xxx/Frameworks/xxx.framework/xxx"
]
framework_paths.each do |framework_relative_path|
strip_bitcode_from_framework(bitcode_strip_path, framework_relative_path)
end
第二步、找到出现问题的Frameworks路径,放到framework_paths数组中。
第三步、删除Pods中有问题的framework,重新执行pod install。
第四步:再次Archive打包上传即可。