旧版本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。
旧版本Flutter使用xcode16打包上架时报错的更多相关文章
- idea中 maven打包时时报错User setting file does not exist C:\Users\lenevo\.m2\setting.xml,
第一种错误 :idea中 maven打包时时报错User setting file does not exist C:\Users\lenevo\.m2\setting.xml, 解决方案如下:将ma ...
- 第一个用eclipse打包APK时报错一个错误怎么解决
这个问题也是我在android开发群里面解决的一个问题. 如果有什么想法或者想法可以在下面进行评论,我们可以一起交流一下! 我们在eclipse中开发完一个程序之后,需要将其打包为APK的安装包,我们 ...
- Vue+Webpack配置css-loader时报错:Module build failed: Unknown word
使用Vue+Webpack搭建工程时,在webpack.config.js中的module的rules里针对各种文件配置加载工具.在针对css文件配置时遇到一个问题:打包构建时报错——Module b ...
- iOS开发基础:最新的APP打包上架流程
之前有人留言让我更新部分文章,下面就为大家分享一下iOS的APP打包上架流程: 上传至apple developer 1.1 上传准备工作 更新上架和发布上架不同,在原始版本首次上架的时候就将描述文件 ...
- 如何下载旧版本的MySQL
可能存在这样的场景,比如一些老系统需要使用MySQL 5.5版本才能运行,其余的不行. 1.登录下载站点 https://dev.mysql.com/downloads/mysql/ 此时的最新版本为 ...
- 一个diff工具,用于判断两个目录下所有的改动(比较新旧版本文件夹)
需求: 编写一个diff工具,用于判断两个目录下所有的改动 详细介绍: 有A和B两个目录,目录所在位置及层级均不确定 需要以B为基准找出两个目录中所有有改动的文件(文件或内容增加.修改.删除),将有改 ...
- Advanced Installer 安装前卸载旧版本的办法
原文:Advanced Installer 安装前卸载旧版本的办法 Advanced Installer这个工具百度出来的资料太少了. 在我们平常打包的工作中,经常遇到的一个问题是,如何能在安装新版本 ...
- 下载旧版本的NDK
在官网找不到旧版本的下载地址,只能取巧了. 写该随笔的时候,NDK最新的版本是r12,见 https://developer.android.com/ndk/downloads/index.html# ...
- ASP.NET 5 DNX SDK删除旧版本
ASP.NET 5各种升级后旧版本的DNX不会删除,想删除旧版本的DNX,可以通过以下命令完成 首先打开CMD或者Powershell 1.先输入dnvm看看命令中是否有uninstall 2.如果没 ...
- Android新旧版本Notification
Android新旧版本Notification 在notification.setLatestEventInfo() 过时了 以前: NotificationManager mn = (Notific ...
随机推荐
- Linux安装最新Erlang、RabbitMQ
进入RabbitMQ官网 简介: RabbitMQ是一个免费的开源企业消息代理软件. 它是用Erlang编写的,并实现了高级消息队列协议(AMQP). 它提供所有主要编程语言的客户端库. 它支持多种消 ...
- SQLPrompt关闭联网
关闭Redgate.client的联网 方法一:修改hosts文件 C:\Windows\System32\drivers\etc\hosts 127.0.0.1 licensing.red-gate ...
- rollup开发一个npm插件/包
创建一个项目 创建一个空项目,并初始化npm init -y 局部安装rollup yarn add --dev rollup 并创建其配置文件 rollup.config.js export def ...
- 树莓派4安装centos
下载镜像这是用的华为的镜像源仓库中下载的,注意不要下载桌面版的centos,安装不上,直接彩虹屏.下载第三个就行http://mirrors.huaweicloud.com/centos-altarc ...
- vue-cli3项目开启less支持并引入短链接
说明用脚手架搭建的时候,可以在选项中开启(支持less).但是如果项目已经建好了这个时候想开启支持,就需要额外做些事情了支持less安装该插件 vue add style-resources-load ...
- Python 脚本最佳实践2025版
前文 可以直接把这篇文章喂给 AI, 可以放到 AI 角色设定里, 也可以直接作为提示词. 这样, 你只管提需求, 写脚本就让 AI 来. 概述 追求简洁和清晰:脚本应简单明了. 使用函数 (func ...
- 使用django-simple-history实现简单审计功能
前言 本文依然是中台项目延伸的笔记 这个系列的文章太小众了,看的人都不多 我争取尽快把这系列完结了,然后进入新的项目 关于审计 之前我在 dotnet 的项目里已经自己实现了审计功能了,还是用切面思想 ...
- FFmpeg开发笔记(七十八)采用Kotlin+Compose的NextPlayer播放器
<FFmpeg开发实战:从零基础到短视频上线>一书的"第 12 章 FFmpeg的移动开发"介绍了如何使用FFmpeg在手机上播放视频,基于FFmpeg的国产播放器开 ...
- SQLServer数据库日志清理
SQLServer数据库日志清理 1.右键在清除日志的数据库,如"TestDB",点击[新建查询(Q)]2.输入以下SQL语句,其中"TestDB"是数据库名称 ...
- AtCoder Beginner Contest 417 (A-E题解)
比赛链接 总体总结 A,B题纯模拟 C题 公式一步转换 D题 五题里面最难的,dp预处理+二分 E题 排序+BFS 题解 A题 A Substring #include <bits/stdc++ ...