flutter module 編譯成framework后進(jìn)行二次封裝后集成入iOS項(xiàng)目

背景

目前大多數(shù)公司都是已經(jīng)開發(fā)多年的原生或混合開發(fā)項(xiàng)目,如果新增模塊想要使用flutter進(jìn)行開發(fā),就需要用到flutter的混合開發(fā)。

應(yīng)公司要求將能重用的flutter plugin放到flutter mudule中,然后將flutter module編譯成framework,最后再將編譯好的framework,放到原生并做好與原生的通訊及橋接再次封裝成原生framework,給用戶的原生項(xiàng)目直接使用。

詳細(xì)步驟分為兩步:

1.將flutter module編譯成framework
2.將flutter module編譯出來的framework,放到原生并邏輯橋接后,再次封裝成framework

項(xiàng)目結(jié)構(gòu)說明

1.重用的plugin依賴 -> 網(wǎng)絡(luò)庫plugin
2.網(wǎng)絡(luò)庫plugin依賴 -> 原生封裝的網(wǎng)絡(luò)庫framework及其他framwork(沒有直接使用flutter的那套網(wǎng)絡(luò)請(qǐng)求)

flutter module的創(chuàng)建及引入方式見這里

一.flutter module編譯成framework

//編譯命令
/*
output=后面是編譯出來的framework存放的地址,可自行存放
*/
//生成三種模式,生成目錄見圖1
1.flutter build ios-framework --output=some/path/MyApp/Flutter/
//只生成release模式,目錄圖1去掉debug及profile
2.flutter build ios-framework --no-debug --no-profile --output=./Flutter/
/*
將 Flutter 框架作為一個(gè) CocoaPods 的 podspec 文件分發(fā)
其實(shí)就是將Flutter.xcframework以pod形式集成
注:可以根據(jù)自己需求,生成對(duì)應(yīng)模式
如:flutter build ios-framework --cocoapods --no-release --no-profile --output=./Flutter/
*/
3.flutter build ios-framework --cocoapods --output=some/path/MyApp/Flutter/

Pasted Graphic 2.png
Pasted Graphic 1.png

溫馨提示
如果不知道flutter build ios-framework后面還可增加什么參數(shù),可使用flutter build ios-framework -h進(jìn)行查看-h其實(shí)就是--help,搜索如下圖,可指定不生成debug、profile、release,默認(rèn)是三個(gè)都會(huì)生成,其他也可自行選擇

image.png

1.flutter build ios-framework之后,報(bào)錯(cuò)如下

意思就是我XX_common.framework的pod配置有錯(cuò)誤,但是沒有具體報(bào)出來,


image.png

那就執(zhí)行讓其輸入詳細(xì)報(bào)錯(cuò)信息,執(zhí)行命令后面加-v

flutter build ios-framework --cocoapods --no-release --no-profile --output=./Flutter/ -v

詳細(xì)報(bào)錯(cuò)如下


image.png

是因?yàn)橛行┪覀冊(cè)木W(wǎng)絡(luò)庫framework沒有加載

原因是App.framework 和 Flutter.framework,包含其他資源文件,無法打包為static framework;將其他庫,可以通過在podSpec 中添加 s.static_framework = true,打包為static framework,然后重新執(zhí)行命令即可打包成功
image.png
2.將打出來Flutter.podspec及多個(gè)xcframework庫,引入到原生的封裝庫中

(1)在Podfile文件中動(dòng)態(tài)引入Flutter.framework,如下圖

image.png

(2)在原生framework項(xiàng)目引入上個(gè)步驟生成的多個(gè)xcframework時(shí),
TARGETS->General->Frameworks and Libraries里面全部設(shè)置為Embed & Sign ,否則最后編譯出來的原生framework會(huì)找不到對(duì)應(yīng)的庫,最終生成example.framework
image.png

(3)原生example.framework編譯完成后,將最終的example.framework引入到最終使用的原生項(xiàng)目中,步驟(1)的Podfile配置仍然需要
當(dāng)你開始調(diào)用example.framework并且運(yùn)行的時(shí)候,會(huì)發(fā)現(xiàn)還是無法找到某個(gè)framework庫,這是因?yàn)閑xample.framework嵌套的靜態(tài)庫不會(huì)動(dòng)態(tài)的把依賴的靜態(tài)庫 link 到這個(gè)項(xiàng)目,Framework 嵌套與依賴看這里
我們需要手動(dòng)將這些xcframework鏈接

TARGETS->General->Frameworks and Libraries


image.png

對(duì)應(yīng)項(xiàng)目目錄的example.framework下的frameworks
image.png

并且根據(jù)framework本身的打包設(shè)置,來設(shè)置Embed,


image.png

設(shè)置錯(cuò)誤會(huì)報(bào)如下錯(cuò)


image.png
image.png

到此,所有踩坑過程結(jié)束,歡迎大家指正

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容