舊版本Flutter使用xcode16打包上架時報錯(contain bitcode)
如圖,最近在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。

浙公網安備 33010602011771號