旧版本Flutter使用xcode16打包上架时报错
如图,最近在Xcode16中打包flutter项目出现了如下的问题。
其实最正统的方法就是升级flutter到最新的版本,它是不添加bitcode。但是由于一些原因,我们是不能升级版本的,于是只能进行修复。
解决方案请看最下面,中间是我解决流程。
初始没细看,一看bitcode就想到是不是在iOS项目中没有设置bitcode或者pod的三方库没有清理bitcode。于是我就在进行了以下检查。
(1)在Xcode中禁用Bitcode:
打开你的Xcode项目。
选择你的项目在Project Navigator中。
选择你的目标应用。
选择“Build Settings”标签。
搜索“Enable Bitcode”并将其设置为“No”。
清理并重建你的项目(使用快捷键Shift + Command + K进行清理,然后使用Command + B进行重建)。
(2)更新或替换第三方库:
如果问题是由第三方库引起的,联系库的供应商获取更新版本,或者寻找不包含Bitcode的替代库。
使用CocoaPods的post_install钩子:
如果你使用CocoaPods管理依赖,可以在Podfile中添加一个post_install钩子来自动剥离所有frameworks中的Bitcode。
post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| # Flutter iOS build settings flutter_additional_ios_build_settings(target) # 强制关闭 Bitcode,防止被覆盖 config.build_settings['ENABLE_BITCODE'] = 'NO' # 统一 Swift 版本 (如果需要) config.build_settings['SWIFT_VERSION'] = '5.3' # 设置最低 iOS 版本 config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0' end end end
经过上述两个方法的检查,我发现我之前都设置了这些,我就很奇怪这是为什么。后面发现人家已经提示的很清楚了是App.app/Frameworks/Flutter.framework/Flutter‘ contains incomplete bitcode。他说的是flutter.framework包含bitcode。这时候我们就需要手动剥离这里面的bitcode。
无效方法一、 使用 --no-bitcode 构建标志
flutter build ipa --no-bitcode --export-options-plist=ios/ExportOptions.plist
但是这个方法是需要一定版本的。第一个build ipa 低版本是build iOS,但是--no-bitcode也是低版本不支持。
无效方法二、手动修改 Xcode 架构脚本
用 Xcode 打开项目:在 Xcode 导航器中选中 Runner target,点击顶部的 "Build Phases" 标签页。展开 "Thin Binary" 或 "Strip Frameworks"。在其中一个脚本之前或者之后添加以下内容。
# 移除 Flutter.framework 中的 Bitcode 段 "${PODS_ROOT}/../flutter/bin/flutter" --suppress-analytics echo "Stripping Bitcode from Flutter.framework" strip -r -t -o "${BUILT_PRODUCTS_DIR}/App.framework/App" "${BUILT_PRODUCTS_DIR}/App.framework/App" 2>/dev/null || true strip -r -t -o "${BUILT_PRODUCTS_DIR}/Flutter.framework/Flutter" "${BUILT_PRODUCTS_DIR}/Flutter.framework/Flutter" 2>/dev/null || true
编译成功后,重新上传还是失败。
无效方法三、手动验证和强制剥离
1.构建后手动检查:
# 构建后,找到 Flutter.framework find build/ios -name "Flutter.framework" -type d # 检查是否包含 Bitcode otool -l /path/to/Flutter.framework/Flutter | grep __LLVM
2.移除
# 进入 Flutter.framework 目录 cd /Users/weichenyang/Downloads/KuaizhunCode/flutter/ops-app/ios/Flutter/Flutter.framework # 移除二进制文件中的 bitcode xcrun bitcode_strip -r Flutter -o /Users/weichenyang/Downloads/Export/Flutter // 详细流程 # 1. 创建输出目录 mkdir -p /Users/user/Downloads/Export/Flutter.framework # 2. 复制整个框架结构 cp -R /Users/user/Downloads/flutter/app/ios/Flutter/Flutter.framework/* /Users/user/Downloads/Export/Flutter.framework/ # 3. 进入输出目录处理二进制文件 cd /Users/user/Downloads/Export/Flutter.framework # 4. 移除 bitcode(这会创建新的二进制文件) xcrun bitcode_strip -r Flutter -o Flutter_stripped # 5. 替换原二进制文件 mv Flutter_stripped Flutter # 6. 确保执行权限 chmod +x Flutter
3.检查
# 检查移除后的文件 otool -l /Users/weichenyang/Downloads/Export/Flutter.framework/Flutter | grep __LLVM # 或者使用更详细的检查 xcrun bitcode_strip -t /Users/weichenyang/Downloads/Export/Flutter.framework/Flutter
4.替换
把当前的famework替换项目中的 但是这样的话需要重新编译打包,这时候就会自动生成bitcode,无效
手动有效方法:
1.打开Xcode的Organizer,找到打包时生成的Archive文件,右键show in finder选择找到相应的.archieve文件,然后再选择显示包内容,进入到.archive文件的内容文件夹,依次进入Products->Applications->Runner(打包生成的.app文件),再右键Runner,选择显示包内容,然后找到Frameworks->Flutter.framework
2.打开终端,cd到Flutter.framework文件夹,然后依次输入以下命令检测framework是否包含bitcode
otool -l Flutter | grep __LLVM | wc -l
3.输入以下命令,将framework的bitcode移除
xcrun bitcode_strip -r Flutter -o Flutter
4.现在你可以返回到,刚才的Organizer页面,愉快的打包上架Appstore了.
终极懒人方法
:脚本运行参考:文章#!/bin/bash # 检查是否提供了路径参数 if [ -z "$1" ]; then echo "Usage: $0 <path_to_xcarchive>" exit 1 fi XCARCHIVE_PATH="$1" APP_PATH="$XCARCHIVE_PATH/Products/Applications/Runner.app/Frameworks/Flutter.framework/Flutter" # 检查 Flutter.framework 是否存在 if [ ! -f "$APP_PATH" ]; then echo "Error: Flutter.framework not found at $APP_PATH" exit 1 fi # 检查 Flutter.framework 是否包含 bitcode BITCODE_CHECK=$(otool -l "$APP_PATH" | grep -q '__LLVM' && echo 1 || echo 0) if [ "$BITCODE_CHECK" -eq 0 ]; then echo "Info: Flutter.framework does not contain bitcode." else echo "Info: Flutter.framework contains bitcode. Removing it..." # 创建一个临时目录来保存修改后的 Flutter.framework(实际上我们只需要修改 Flutter 可执行文件) TEMP_DIR=$(mktemp -d) TEMP_FLUTTER_PATH="$TEMP_DIR/Flutter" # 复制 Flutter 可执行文件到临时目录 cp "$APP_PATH" "$TEMP_FLUTTER_PATH" # 删除临时目录中的 Flutter 的 bitcode xcrun bitcode_strip -r "$TEMP_FLUTTER_PATH" -o "$TEMP_FLUTTER_PATH" # 将修改后的 Flutter 可执行文件复制回原位置 cp "$TEMP_FLUTTER_PATH" "$APP_PATH" # 清理临时目录 rm -rf "$TEMP_DIR" echo "Info: Bitcode has been removed from Flutter.framework." fi echo "Script execution completed."
使用说明:
将上述脚本保存为一个文件,例如 remove_bitcode_from_xcarchive.sh。
给脚本添加执行权限:chmod +x remove_bitcode_from_xcarchive.sh。
运行脚本,并传入 .xcarchive 文件的路径:./remove_bitcode_from_xcarchive.sh /Users/wen/Library/Developer/Xcode/Archives/2025-01-07/Runner 2025-1-7, 10.50.xcarchive。