一衣陶、概述
近期將測試機升級至 iOS14 ,測試使用 Flutter混合開發(fā) 的線上 APP闸氮,沒發(fā)現(xiàn)什么問題剪况,但是使用 Xcode 安裝APP的場景下,斷開 Xcode 后再運行卻閃退了蒲跨。
APP 測試結(jié)果如下:
APP來源 | 是否閃退 | 模式 |
---|---|---|
線上 | 否 | release |
fir/蒲公英 | 是 | debug |
Xcode | 是(斷開 Xcode 后再打開 APP ) | debug |
問題原因
閃退的原因是因為 Flutter SDK, Flutter 官方對 iOS14 進行了說明:Flutter官網(wǎng)說明鏈接
大致意思就是說译断,如果我們在 iOS14 的真機上安裝了 debug模式 編譯出來的 flutter 應(yīng)用,那么在斷開編譯安裝連接后或悲,將無法從桌面上打開該應(yīng)用程序孙咪。
解決方案
1.使用 Xcode 或 flutter run 來運行。
2.設(shè)置 Flutter 模塊的編譯模式為 profile 或 release巡语。
補充說明
該閃退的情況只發(fā)生在真機翎蹈,并且在模擬器運行的時候, Flutter 模塊的編譯模式需要為 debug男公, 如果設(shè)置了 release荤堪,編譯將會報錯。
官方指出如果是 純Flutter項目 可以直接使用 master channel 的 Flutter版本 解決這個問題,但對混合開發(fā)并沒有該說明澄阳,加上我們是使用閑魚的 flutter_boost 實現(xiàn)的混合開發(fā)曙寡,限制了 Flutter 的版本,所以我也就沒有去實踐該方案對我們是否可行
二寇荧、嘗試解決
根據(jù)自己的實際情況举庶,我選擇了上述的第二個解決方案。
配置
用 Xcode 打開工程項目揩抡,在 Build Settings 的最下方找到 User-Defined户侥,點擊 + 按鈕,添加一個鍵為 FLUTTER_BUILD_MODE 峦嗤,值為 release 的配置蕊唐。
運行
再次運行到真機上,斷開 Xcode 運行也不會崩潰了
問題
真機的問題看似是解決了烁设,但是會有問題
問題一:release 或 profile 模式下替梨,F(xiàn)lutter 使用的是 AOT,一些功能不能使用装黑,如:代碼斷點調(diào)試副瀑,熱重載
問題二:上面也提到了,模擬器只能運行在 debug 模式下恋谭,而我們無法避免會在真機和模擬器之間反復(fù)切換運行糠睡,每次切換就需要手動調(diào)整 FLUTTER_BUILD_MODE 的值,十分麻煩
那有什么好的辦法解決上面遇到的問題呢疚颊?
三狈孔、優(yōu)化方案
其實,真機上的 APP 在斷開 Xcode 后無法運行材义,這個對我們開發(fā)者來說不是什么問題均抽,問題是給到測試人員就必須要可以打開才行,包括蒲公英上的包其掂,所以為了節(jié)省這些不必要的時間油挥,我們需要自己動手?jǐn)]一個幫助我們切換 Flutter編譯模式 的腳本。
在修改 FLUTTER_BUILD_MODE 的值時清寇,我從 git 中發(fā)現(xiàn)喘漏,實際上是修改了 項目.xcodeproj,那目前有什么工具可以幫助我們修改 xcodeproj 文件呢华烟?
這里我找到了mod-pbxproj翩迈,安裝和使用在該庫的 wiki 上寫的很清楚,這里就不再贅述了盔夜,直接上代碼
import getoptimport sysfrom pbxproj
import XcodeProjectif
__name__ == "__main__": argv = sys.argv[1:] # 處理flutter_build_mode
flutter_build_mode = (False, "release") # target名稱
target_name = None try: opts, args = getopt.getopt(argv, "p:m:t:", ["path=, mode=, target="]) except getopt.GetoptError: print('switch_flutter_build_mode.py
-p "plist文件路徑"
-m "模式(release|debug)"
-t "target名稱"') sys.exit(1) for opt, arg in opts: if opt in ["-p", "--path"]: project_path = arg if len(project_path) == 0:
print('請輸入項目的地址')
sys.exit(2) if opt in ["-m", "--mode"]: flutter_build_mode = (True, arg if len(arg) > 0 else "release") if opt in ["-t", "--target"]: target_name = arg # 處理flutter
if flutter_build_mode[0]: fileName = project_path.split("/")[-1] if not fileName.endswith("xcodeproj"):
print("請使用-p指定.xcodeproj文件的路徑")
sys.exit(3) project = XcodeProject.load(project_path + '/project.pbxproj') # 設(shè)置 User-Defined (如果target_name是None负饲,則每個target都會設(shè)置flag)
project.set_flags('FLUTTER_BUILD_MODE', flutter_build_mode[1], target_name) project.save()
使用也很簡單堤魁,終端直接輸入如下命令
Shell
'''
python switch_flutter_build_mode.py -p 'xxx/項目.xcodeproj' -t target名稱 -m release
'''
各參數(shù)說明
參數(shù) | 用途 |
---|---|
-p | xcodeproj 文件的路徑 |
-t | target 名稱 |
-m | 編譯模式 ( release、debug返十、profile ) |
PS: 腳本基于 Python3
我們是使用 Jenkins 進行打包并自動上傳至蒲公英的妥泉,所以只需要在 Jenkins 中配置打包前調(diào)用該腳本即可。
最后再結(jié)合 Shuttle 這個軟件洞坑,就可以實現(xiàn)以界面的方式去切換編譯模式了
轉(zhuǎn)自:鏈接