Flutter混編之路——iOS踩坑記錄

一、運行Xcode編譯或者flutter run/build 過程中報錯:"x86_64" is not an allowed value for option "ios-arch".


解決方案

在Debug.xcconfig中指定 “FLUTTER_BUILD_MODE=debug”,Release.xcconfig中指定“FLUTTER_BUILD_MODE=release”

錯誤分析

這看起來是在模擬器編譯環境下選擇了真機的Framework什么的,后來查詢發現是沒有設置這個變量。因為工程的Build Phases里運行了<"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh"?build>相關命令,而xcode_backend里為build_mode變量設置了默認值"release",這使得在查找Flutter.framework等編譯所需的“原材料”時,默認選擇了release的目錄,導致了這個錯誤,所以,加上debug這個設置后,會去ios這個目錄中查找相關文件,就不會有問題了。附目錄截圖:

注:所在目錄 flutter/bin/cache/artifacts/engine/


二、Flutter plugin not installed; this adds Flutter specific functionality.?Dart plugin not installed; this adds Dart specific functionality


解決方案

1.) Start the Android Studio application

2.) Open plugin preferences (Preferences>Plugins on macOS, File>Settings>Plugins on Windows & Linux).

3.) Select Browse repositories…, select the Flutter plug-in and click install .

4.) Click Yes when prompted to install the Dart plugin.

5.) Click Restart when prompted.

錯誤分析

如果你使用的是iOS開發環境或者沒有安裝Flutter插件的Android Studio,會報這個錯誤。Flutter是Google開發的移動開發SDK,為了方便,基于自己的IDE開發了Flutter插件,以方便集成過程。在Flutter生成雙端產物的時候,需要經過插件做一些操作。

三、Android license status unknown


解決方案

執行 “flutter doctor --android-licenses” 命令

會問你'Do you want to review the licenses?',輸入“y” 然后 回車,這時再執行一次flutter doctor就好了


四、MissingPluginException(No implementation found for method xxx on channel xxx)


解決方案

方案一:flutter clean一下,再次 flutter run/build

方案二:將flutter run的進程終止掉重新 flutter run/build

方案三:看看你的FlutterPluginRegistrant產物是否存在,是否更新了

錯誤分析

問題本質是Plugin的方法沒有找到,也可能是Plugin本身就沒有注冊成功。老版本的Flutter SDK遇到這個問題可能是沒有觸發GeneratedPluginRegistrant.register(this),新版本的已經不需要手動觸發了。


五、Waiting for another flutter command to release the startup lock


解決方案

rm ./flutter/bin/cache/lockfile

錯誤分析

原因是在flutter編譯等操作運行過程中,會創建一個文件鎖,但是由于一些原因鎖沒有釋放導致的,而且一直無法釋放……


六、'Flutter/Flutter.h' file not found


解決方案

方案一:如果集成方式是靜態庫(.a),需要在引用Flutter的工程中,修改Build settings中的Header Search Paths,將Flutter所在目錄加入其中。

方案二:如果集成方式是動態庫(.framework),說明在引用Flutter的工程中并沒有依賴成功,需要檢查Flutter.framework包內是否包含Headers文件夾,是否其中包含Flutter.h,另外就是Podspec和podfile是否正確。還有,Cocoapods必須1.5版本及以上。

方案三:如果你用的podspec.json,試試改寫成podspec(這個坑曾讓我浪費了幾天的時間……)


七、error: cannot parse the debug map for xxx: No such file or directory


解決方案

依賴產物只針對 真機 ,但調試中使用了另一種 模擬器。或者反過來了。

錯誤分析

真機和模擬器的平臺是不同的,符號也不同。


八、diff: /../Podfile.lock: No such file or directory


解決方案

方案一:重新pod install

方案二:刪除workspace、podfile.lock、Pods/、~/Library/Developer/Xcode/DerivedData

方案三:

1、運行sudo gem install cocoapods-deintegrate安裝快速解除項目cocopods依賴的庫

2、安裝成功后,cd到你項目的更目錄運行pod deintegrate解除項目cocopods依賴

3、運行pod install,重新安裝cocopods

錯誤分析

Cocoapods的鍋……


九、Flutter Bitcode


解決方案

在podfile中禁止bitcode

錯誤分析

Flutter相關集成是不支持bitcode的,所以需要將相關產物的bitcode功能關閉。如果你的現有工程中倉庫眾多,有的倉庫是必須bitcode的,這樣的話就需要每次pod install之后再在工程配置中手動設置回來,以下腳本放在podfile中可以解決此問題。

post_install do |installer|

????????installer.pods_project.targets.each do |target|

????????????????if target.name =="App" || target.name =="Flutter"

????????????????????????target.build_configurations.each do |config|

????????????????????????????????config.build_settings['ENABLE_BITCODE'] ='NO'

????????????????????????end

????????????????end

????????end

end


十、module importing failed: ('invalid syntax', ('temp.py',xxx


解決方案

執行以下命令

brew update

brew uninstall --ignore-dependencies libimobiledevice ios-deploy cocoapods

brew uninstall --ignore-dependencies usbmuxd

brew install --HEAD usbmuxd

brew unlink usbmuxd

brew link usbmuxd

brew install --HEAD libimobiledevice

brew install ideviceinstaller ios-deploy cocoapods


十一、Flutter集成到現有工程后,性能問題


解決方案

用Release產物集成

問題分析

為了實現Hot refresh功能,Flutter在Debug下做了很多工作,影響了性能,可以通過修改

FLUTTER_BUILD_MODE的值("debug" => "release")

使用Release產物集成的方式屏蔽這部分影響。注意,flutter_assets是需要同時更新的,Debug產物中含有kernel_blob.bin文件,Release產物則沒有。


十二、iOS系統中,第一次從Native跳轉到Flutter頁面時,會出現LaunchScreen


解決方案

采用繼承、Category同名方法等方式,覆蓋FlutterViewController的splashScreenView的get方法,直接返回成員變量,將中間的讀取LaunchScreen頁面過程覆蓋掉,甚至可以自定義自己的邏輯。

問題分析

Flutter的渲染是異步的,第一次加載需要創建Application和頁面,無法及時返回結果,所以Flutter自己把這部分邏輯加到了SDK內部,其實是為了解決 “純Flutter App首屏白屏” 問題,但給我們這種混編的App帶來了麻煩。


以上是我們到目前為止遇到的主要坑位,以及解決方案和原因分析,Flutter無論從性能還是人效方面來講,都會在熟悉之后節省不少成本,希望各位能從我們的經驗中節省更多寶貴的時間。同時,也希望大家把更多的埋坑記錄發到評論里,幫助友隊一起學習,一起成長。歡迎技術交流!

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,494評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,283評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,953評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,714評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,410評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,940評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,776評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,210評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,654評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容