前段時間根據官方不是很新的混編wiki寫了一篇混編相關的demo文章,現在回看官方wiki。不知道優化了好幾個版本。針對網友的回復也有回復。但現在看來部分回復可能失效,也可能不是最優解,所以親自按照官方混編wiki優化了自己項目的混編,看看和之前有什么不同(前提是不需要修改官方flutter的混編源文件)
一、材料準備(不明白的可以先參考前一篇文章)
- flutter環境
- flutter module (注意文件路徑最好不要出現中文,否則
flutter build
可能會出現UTF8等報錯) - Xcode Debug/Release 配置文件
- Pods (wiki教程最新,主要講這種方式)
1、項目目錄命令行執行pod init
,Podfile文件編寫以下代碼,后執行pod install
# 下面是復制官方demo的podfile內容修改:
# 這里寫你的flutter module相對路徑
flutter_application_path = '../flutter_module/'
# NewHybridDemo 是你的項目名,用你自己的,只要copy下一行代碼就行
target 'NewHybridDemo' do
eval(File.read(File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')),binding)
end
如果按官方的形式pod install
總是報錯,請命令行指定到你flutter module目錄執行flutter packages get
完成后,在指回Xcode工程目錄執行pod install
2、配置文件編寫 (可以不用寫了,因為pod的時候已經引入了pod的配置文件中了)
3、Run Script
"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" build
寫完執行Xcode build(cmd+B
)操作,你會發現項目中并沒有生成framework等Flutter資源文件。因為默認情況下xcode_backend.sh
將framework打包到了flutter module中路徑(flutter module)/.ios/Flutter
中。
4、膠水文件導入方式(項目同級創建混編資源存放文件夾)
- 方式一:手動到
(flutter module)/.ios/Flutter
下將資源拖到剛創建好的Flutter文件夾下; - 方式二:修改
xcode_backend.sh
文件;
// 搜索 local derived_dir="${SOURCE_ROOT}/Flutter"
// 將它下面三行注釋
local derived_dir="${SOURCE_ROOT}/Flutter"
# if [[ -e "${project_path}/.ios" ]]; then
# derived_dir="${project_path}/.ios/Flutter"
# fi
RunCommand mkdir -p -- "$derived_dir"
AssertExists "$derived_dir"
- 方式三:RunScript寫cp代碼,將
(flutter module)/.ios/Flutter
下將資源使用命令行代碼copy到Flutter文件夾中;(建議使用,不用人工操作也不用擔心官方后續修改xcode_backend.sh
文件更新flutter沖突。美滋滋~)
# 刪除本地Flutter文件夾
rm -rf -- "$SOURCE_ROOT/Flutter"
# 再生成Flutter文件夾
mkdir -p "$SOURCE_ROOT/Flutter"
# 編譯生成
"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" build
# 將膠水文件copy到本地文件夾
cp -r -- "$FLUTTER_APPLICATION_PATH/.ios/Flutter/flutter_assets" "$SOURCE_ROOT/Flutter"
cp -r -- "$FLUTTER_APPLICATION_PATH/.ios/Flutter/App.framework" "$SOURCE_ROOT/Flutter"
注意:如果使用pod方式做膠水文件的話,
Flutter.framework
就沒必要導入了,pod已經處理!
framework資源
使用Create groups
方式導入(導入完后記得到項目配置General - Embedded Binaries
中將導入好的framework添加);
其他資源文件夾flutter_assets
使用Creat folder references
方式導入
二、優化相關
1、framework包瘦身
官方在
xcode_backend.sh
文件中已經有了瘦身的操作,只要在RunScript再添加一行代碼(build下面,有framework才能瘦身)即可解決。
# 瘦身
"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" thin
2、上架提交商店報錯解決
使用lipo命令查看Flutter.framework信息,確實又存在x86_64
所以解決辦法就是將x86_64
從framework中去除,使用lipo -remove
命令即可;方式也很多隨個人喜歡。這里我只說一種,如果用pod導入的話Flutter.framework
文件路徑在(flutter module)/.ios/Flutter/engine/
下。所以可以找到它,命令行剔除;我比較喜歡交給機器去幫我實現一些人為操作,所以我選擇放到RunScript去進行操作
if [[ "$CONFIGURATION" =~ "Release" ]];then
# Release環境刪除Flutter.framework "x86_64" 框架
lipo -remove "x86_64" "$FLUTTER_APPLICATION_PATH/.ios/Flutter/engine/Flutter.framework/Flutter" -output "$FLUTTER_APPLICATION_PATH/.ios/Flutter/engine/Flutter.framework/Flutter"
fi
但值得注意的是:
Flutter.framwork
剔除了x86_64
,虛擬機就跑不了了。所以我會放到Xcode Release環境再進行刪除。
三、本文參考
0、Demo-NewHybridDemo
1、官方混編wiki
2、官方混編demo
3、Flutter iOS減包方案
4、Need to explain how to build app for submission to app store #7888
5、Submit to App Store issues: Unsupported Architecture x86
如果寫不對的地方請指出,或者有更好的方式望不吝賜教!