如图,最近在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打包上架时报错的更多相关文章

  1. 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 ...

  2. 第一个用eclipse打包APK时报错一个错误怎么解决

    这个问题也是我在android开发群里面解决的一个问题. 如果有什么想法或者想法可以在下面进行评论,我们可以一起交流一下! 我们在eclipse中开发完一个程序之后,需要将其打包为APK的安装包,我们 ...

  3. Vue+Webpack配置css-loader时报错:Module build failed: Unknown word

    使用Vue+Webpack搭建工程时,在webpack.config.js中的module的rules里针对各种文件配置加载工具.在针对css文件配置时遇到一个问题:打包构建时报错——Module b ...

  4. iOS开发基础:最新的APP打包上架流程

    之前有人留言让我更新部分文章,下面就为大家分享一下iOS的APP打包上架流程: 上传至apple developer 1.1 上传准备工作 更新上架和发布上架不同,在原始版本首次上架的时候就将描述文件 ...

  5. 如何下载旧版本的MySQL

    可能存在这样的场景,比如一些老系统需要使用MySQL 5.5版本才能运行,其余的不行. 1.登录下载站点 https://dev.mysql.com/downloads/mysql/ 此时的最新版本为 ...

  6. 一个diff工具,用于判断两个目录下所有的改动(比较新旧版本文件夹)

    需求: 编写一个diff工具,用于判断两个目录下所有的改动 详细介绍: 有A和B两个目录,目录所在位置及层级均不确定 需要以B为基准找出两个目录中所有有改动的文件(文件或内容增加.修改.删除),将有改 ...

  7. Advanced Installer 安装前卸载旧版本的办法

    原文:Advanced Installer 安装前卸载旧版本的办法 Advanced Installer这个工具百度出来的资料太少了. 在我们平常打包的工作中,经常遇到的一个问题是,如何能在安装新版本 ...

  8. 下载旧版本的NDK

    在官网找不到旧版本的下载地址,只能取巧了. 写该随笔的时候,NDK最新的版本是r12,见 https://developer.android.com/ndk/downloads/index.html# ...

  9. ASP.NET 5 DNX SDK删除旧版本

    ASP.NET 5各种升级后旧版本的DNX不会删除,想删除旧版本的DNX,可以通过以下命令完成 首先打开CMD或者Powershell 1.先输入dnvm看看命令中是否有uninstall 2.如果没 ...

  10. Android新旧版本Notification

    Android新旧版本Notification 在notification.setLatestEventInfo() 过时了 以前: NotificationManager mn = (Notific ...

随机推荐

  1. Linux安装最新Erlang、RabbitMQ

    进入RabbitMQ官网 简介: RabbitMQ是一个免费的开源企业消息代理软件. 它是用Erlang编写的,并实现了高级消息队列协议(AMQP). 它提供所有主要编程语言的客户端库. 它支持多种消 ...

  2. SQLPrompt关闭联网

    关闭Redgate.client的联网 方法一:修改hosts文件 C:\Windows\System32\drivers\etc\hosts 127.0.0.1 licensing.red-gate ...

  3. rollup开发一个npm插件/包

    创建一个项目 创建一个空项目,并初始化npm init -y 局部安装rollup yarn add --dev rollup 并创建其配置文件 rollup.config.js export def ...

  4. 树莓派4安装centos

    下载镜像这是用的华为的镜像源仓库中下载的,注意不要下载桌面版的centos,安装不上,直接彩虹屏.下载第三个就行http://mirrors.huaweicloud.com/centos-altarc ...

  5. vue-cli3项目开启less支持并引入短链接

    说明用脚手架搭建的时候,可以在选项中开启(支持less).但是如果项目已经建好了这个时候想开启支持,就需要额外做些事情了支持less安装该插件 vue add style-resources-load ...

  6. Python 脚本最佳实践2025版

    前文 可以直接把这篇文章喂给 AI, 可以放到 AI 角色设定里, 也可以直接作为提示词. 这样, 你只管提需求, 写脚本就让 AI 来. 概述 追求简洁和清晰:脚本应简单明了. 使用函数 (func ...

  7. 使用django-simple-history实现简单审计功能

    前言 本文依然是中台项目延伸的笔记 这个系列的文章太小众了,看的人都不多 我争取尽快把这系列完结了,然后进入新的项目 关于审计 之前我在 dotnet 的项目里已经自己实现了审计功能了,还是用切面思想 ...

  8. FFmpeg开发笔记(七十八)采用Kotlin+Compose的NextPlayer播放器

    <FFmpeg开发实战:从零基础到短视频上线>一书的"第 12 章  FFmpeg的移动开发"介绍了如何使用FFmpeg在手机上播放视频,基于FFmpeg的国产播放器开 ...

  9. SQLServer数据库日志清理

    SQLServer数据库日志清理 1.右键在清除日志的数据库,如"TestDB",点击[新建查询(Q)]2.输入以下SQL语句,其中"TestDB"是数据库名称 ...

  10. AtCoder Beginner Contest 417 (A-E题解)

    比赛链接 总体总结 A,B题纯模拟 C题 公式一步转换 D题 五题里面最难的,dp预处理+二分 E题 排序+BFS 题解 A题 A Substring #include <bits/stdc++ ...