找回密码
 立即注册
首页 业界区 业界 旧版本Flutter使用xcode16打包上架时报错

旧版本Flutter使用xcode16打包上架时报错

兼罔 前天 09:45
如图,最近在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。
  1. post_install do |installer|
  2.   installer.pods_project.targets.each do |target|
  3.     target.build_configurations.each do |config|
  4.       # Flutter iOS build settings
  5.       flutter_additional_ios_build_settings(target)
  6.       # 强制关闭 Bitcode,防止被覆盖
  7.       config.build_settings['ENABLE_BITCODE'] = 'NO'
  8.       
  9.       # 统一 Swift 版本 (如果需要)
  10.       config.build_settings['SWIFT_VERSION'] = '5.3'
  11.       # 设置最低 iOS 版本
  12.       config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0'
  13.     end
  14.   end
  15. end
复制代码
经过上述两个方法的检查,我发现我之前都设置了这些,我就很奇怪这是为什么。后面发现人家已经提示的很清楚了是App.app/Frameworks/Flutter.framework/Flutter‘ contains incomplete bitcode。他说的是flutter.framework包含bitcode。这时候我们就需要手动剥离这里面的bitcode。
无效方法一、 使用 --no-bitcode 构建标志
  1. 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"。在其中一个脚本之前或者之后添加以下内容。
  1. # 移除 Flutter.framework 中的 Bitcode 段
  2. "${PODS_ROOT}/../flutter/bin/flutter" --suppress-analytics
  3. echo "Stripping Bitcode from Flutter.framework"
  4. strip -r -t -o "${BUILT_PRODUCTS_DIR}/App.framework/App" "${BUILT_PRODUCTS_DIR}/App.framework/App" 2>/dev/null || true
  5. strip -r -t -o "${BUILT_PRODUCTS_DIR}/Flutter.framework/Flutter" "${BUILT_PRODUCTS_DIR}/Flutter.framework/Flutter" 2>/dev/null || true
复制代码
编译成功后,重新上传还是失败。
无效方法三、手动验证和强制剥离
1.构建后手动检查:
  1. # 构建后,找到 Flutter.framework
  2. find build/ios -name "Flutter.framework" -type d
  3. # 检查是否包含 Bitcode
  4. otool -l /path/to/Flutter.framework/Flutter | grep __LLVM
复制代码
2.移除
  1. # 进入 Flutter.framework 目录
  2. cd /Users/weichenyang/Downloads/KuaizhunCode/flutter/ops-app/ios/Flutter/Flutter.framework
  3. # 移除二进制文件中的 bitcode
  4. xcrun bitcode_strip -r Flutter -o /Users/weichenyang/Downloads/Export/Flutter
  5. // 详细流程
  6. # 1. 创建输出目录
  7. mkdir -p /Users/user/Downloads/Export/Flutter.framework
  8. # 2. 复制整个框架结构
  9. cp -R /Users/user/Downloads/flutter/app/ios/Flutter/Flutter.framework/* /Users/user/Downloads/Export/Flutter.framework/
  10. # 3. 进入输出目录处理二进制文件
  11. cd /Users/user/Downloads/Export/Flutter.framework
  12. # 4. 移除 bitcode(这会创建新的二进制文件)
  13. xcrun bitcode_strip -r Flutter -o Flutter_stripped
  14. # 5. 替换原二进制文件
  15. mv Flutter_stripped Flutter
  16. # 6. 确保执行权限
  17. chmod +x Flutter
复制代码
3.检查
  1. # 检查移除后的文件
  2. otool -l /Users/weichenyang/Downloads/Export/Flutter.framework/Flutter | grep __LLVM
  3. # 或者使用更详细的检查
  4. 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
  1. otool -l Flutter | grep __LLVM | wc -l
复制代码
3.输入以下命令,将framework的bitcode移除
  1. xcrun bitcode_strip -r Flutter -o Flutter
复制代码
4.现在你可以返回到,刚才的Organizer页面,愉快的打包上架Appstore了.
终极懒人方法:脚本运行参考:文章
  1. #!/bin/bash
  2. # 检查是否提供了路径参数
  3. if [ -z "$1" ]; then
  4.   echo "Usage: $0 <path_to_xcarchive>"
  5.   exit 1
  6. fi
  7. XCARCHIVE_PATH="$1"
  8. APP_PATH="$XCARCHIVE_PATH/Products/Applications/Runner.app/Frameworks/Flutter.framework/Flutter"
  9. # 检查 Flutter.framework 是否存在
  10. if [ ! -f "$APP_PATH" ]; then
  11.   echo "Error: Flutter.framework not found at $APP_PATH"
  12.   exit 1
  13. fi
  14. # 检查 Flutter.framework 是否包含 bitcode
  15. BITCODE_CHECK=$(otool -l "$APP_PATH" | grep -q '__LLVM' && echo 1 || echo 0)
  16. if [ "$BITCODE_CHECK" -eq 0 ]; then
  17.   echo "Info: Flutter.framework does not contain bitcode."
  18. else
  19.   echo "Info: Flutter.framework contains bitcode. Removing it..."
  20.   
  21.   # 创建一个临时目录来保存修改后的 Flutter.framework(实际上我们只需要修改 Flutter 可执行文件)
  22.   TEMP_DIR=$(mktemp -d)
  23.   TEMP_FLUTTER_PATH="$TEMP_DIR/Flutter"
  24.   
  25.   # 复制 Flutter 可执行文件到临时目录
  26.   cp "$APP_PATH" "$TEMP_FLUTTER_PATH"
  27.   
  28.   # 删除临时目录中的 Flutter 的 bitcode
  29.   xcrun bitcode_strip -r "$TEMP_FLUTTER_PATH" -o "$TEMP_FLUTTER_PATH"
  30.   
  31.   # 将修改后的 Flutter 可执行文件复制回原位置
  32.   cp "$TEMP_FLUTTER_PATH" "$APP_PATH"
  33.   
  34.   # 清理临时目录
  35.   rm -rf "$TEMP_DIR"
  36.   
  37.   echo "Info: Bitcode has been removed from Flutter.framework."
  38. fi
  39. 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。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册