最近項目中要集成flutter來進行混編,但是在集成后,突然遇到一個很神奇的問題,在debug模式下,用數(shù)據(jù)線連接真機打包可以打開flutter頁面,但是一旦拔掉數(shù)據(jù)線,再打開flutter頁面就不行了,開始以為是因為flutterSDK的原因,但是一查資料才發(fā)現(xiàn),原來是因為debug模式下flutter實現(xiàn)了熱重載,默認的編譯方式是JIV,但是iOS14+之后的系統(tǒng)限制了JIV這種編譯方式,所以連接Xcode重新run一個release包就可以了,因為flutter在release模式下的編譯方式是AOT,iOS14+的系統(tǒng)是支持這種編譯方式的,具體解決方案如下圖

創(chuàng)新互聯(lián)服務(wù)項目包括黑龍江網(wǎng)站建設(shè)、黑龍江網(wǎng)站制作、黑龍江網(wǎng)頁制作以及黑龍江網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,黑龍江網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到黑龍江省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
再運行就可以了。
當(dāng)然還有另外一種解決方案,就是修改flutter的編譯配置,強制設(shè)為release
1.在項目目錄執(zhí)行 flutter create -t module XXX(flutter模塊名) ;
2.修改Podfile,設(shè)置path,關(guān)聯(lián)podhelper.rb,注意采用 load File.join() ,不采用之前的eval語句,在target do下install;
3.執(zhí)行pod install;
4.修改AppDelegate為FlutterAppDelegate;
5.初始化并注冊FlutterEngine;
6.vscode里flutter attach實時調(diào)試;
做完這些正常開發(fā)是可以了,至于打包需要更改什么再續(xù)。
iOS項目引入Flutter后,安裝Debug包,打開Flutter界面會出現(xiàn)"In iOS 14+, debug mode Flutter apps can only be launched from Flutter tooling, IDEs with Flutter plugins or from Xcode"問題。
解決辦法如下:
用 [Xcode] 打開工程項目,在 Build Settings 的最下方找到 User-Defined,點擊 + 按鈕,添加一個鍵為 FLUTTER_BUILD_MODE ,debug設(shè)置profile模式,release設(shè)置release 模式。
最近在集成flutter進項目
以收集編譯產(chǎn)物并以cocopods方式集成
產(chǎn)物大概放入兩個pod庫
這個暫且叫pod1,pod1放flutter.framework,第三方plugin.a,自己寫的基礎(chǔ)plugin,比如networking,hud等等(由于是混編,不可避免存在很多原生基礎(chǔ)組件,所以能公用的基礎(chǔ)組件都會弄一個flutter-plugin橋接)
第二個pod2放編譯之后的app.framwork,注冊文件GeneratedPluginRegistrant,以及各個業(yè)務(wù)模塊.a(有可能沒有)結(jié)構(gòu)大概如下面
podspec大概如下
主工程引入這兩個pod庫即可
接下來從零開始搭建上文所說的
先創(chuàng)建一個flutter module
這個是主flutter工程,用來集成businessModule以及生成app.framework
結(jié)構(gòu)如下圖
再生成一個業(yè)務(wù)工程
注意此時還需要進入example生成ios和Android工程,不然無法單獨編譯運行
這樣 這個單獨的業(yè)務(wù)模塊就可以單獨跑起來了
此時主flutter工程和業(yè)務(wù)工程均搭建完畢
在主工程pubspec.ymal文件講兩個工程關(guān)聯(lián)
好了 接下來就是編寫腳本收集產(chǎn)物了
編譯完成之后會在flutter主工程product生成如下文件
將上面文件分類收集做成文章開頭的pod1,pod2 ,在native工程引入即可
在集成flutter的過程中 踩不少坑 也閱讀很多前輩的文章,在此一并感謝
在flutter官網(wǎng)上推薦了iOS項目中兩種混編方式:
筆者在采用兩種集成方式的過程中,因為iOS項目結(jié)構(gòu)設(shè)計導(dǎo)致這兩種簡單的集成方式都有些麻煩,所以在實踐中更改和優(yōu)化了集成方式,使之在筆者的項目中能夠更加簡單和快速的集成。
問題:在不更改flutter tool中相關(guān)腳本的前提下,添加的Script Phase中的腳本相對路徑錯誤,如果只是開發(fā),手動更改下路徑就可以了,但是在考慮到CI中不能每次在pod install之后都去更改,所以在開發(fā)調(diào)試中采用該集成方式,結(jié)合flutter attach的方式去調(diào)試。
通過編譯相關(guān)的 xcframework + Cocoapods私有庫的集成方式在CI中集成,這樣QA的CI不需要配置flutter的相關(guān)依賴
根據(jù)flutter編譯工具的提示: 上面的編譯命令是打包flutter工程項目和插件的產(chǎn)物,在實際開發(fā)過程中可以發(fā)現(xiàn)是否引入了依賴Native的插件會導(dǎo)致貶義編譯產(chǎn)物的不同。
根據(jù)上面的對比:
第一部分:基礎(chǔ)的 Flutter Engine + Flutter App 編譯后的產(chǎn)物 Flutter.xcframwork -- Flutter引擎的包 App.xcframework -- 工程項目對應(yīng)的AOT的編譯產(chǎn)物 第二部分:三方插件的注冊中心 FlutterPluginRegistrant.xcframework -- 第三方插件的注冊中心,其實是Native + iOS通信的集合 第三部分:依賴iOS Native的原生 FMDB . xcframwork path_provider_ios.xcframework sqflite.xcframework -- cached_network_image依賴的原生實現(xiàn)
根據(jù)上面的編譯產(chǎn)物可以知道Flutter和App是編譯后必有的包,后面的兩個部分完全是服務(wù)于三方插件的,到這可以解答第二個問題:筆者App的混編過程中混編插件失效是因為筆者在NativeApp中重寫了Flutter的容器,使用了FlutterEngineGroup動態(tài)創(chuàng)建多引擎去對應(yīng)進入不同的功能模塊,混合插件是因為重寫過程中沒有通過GeneratedPluginRegistrant注冊插件,所以需要在Native的Flutter容器中注冊插件,使之生效。
在這為什么使用commit的hash作為flutter-libs的依賴,因為pod install的時候會有緩存,除了版本好,commit hash也能保證每次CI編譯通過 pod install 來更新flutter-libs依賴產(chǎn)物
完成!!!
網(wǎng)頁名稱:包含flutter混編調(diào)試的詞條
當(dāng)前地址:http://chinadenli.net/article38/dsgsppp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、網(wǎng)站排名、網(wǎng)站維護、定制網(wǎng)站、營銷型網(wǎng)站建設(shè)、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)