iOS原生集成Flutter開發(fā)環(huán)境

目前對(duì)于Flutter開發(fā)來(lái)說(shuō)十办,主要的場(chǎng)景還是Native和Flutter混合開發(fā)的模式,而如何正確的在Native中集成Flutter則是我們的第一步揩局。

現(xiàn)在網(wǎng)上關(guān)于Flutter集成的文章還是很多的,但是大多數(shù)還是不夠詳細(xì),而且同樣的方式去集成的話沒辦法集成成功残腌。在這里主要分享一下自己的集成經(jīng)驗(yàn)。

嘗試的幾種集成方式:

1、手動(dòng)集成抛猫,手動(dòng)去進(jìn)行每一步的環(huán)境配置

2蟆盹、參考閑魚的集成方案,使用開源組件Flutter-boot集成

3闺金、使用cocoapods集成

對(duì)于前兩種方式逾滥,目前沒有能成功的去配置好集成的環(huán)境(可能是姿勢(shì)不對(duì)吧~)。而第三種方式败匹,雖然也經(jīng)歷了一點(diǎn)小波折寨昙,但是最后還是成功的集成了開發(fā)環(huán)境。下面會(huì)對(duì)前兩種失敗的經(jīng)歷做一個(gè)簡(jiǎn)要描述哎壳,接著會(huì)著重介紹下第三種方式的集成過(guò)程毅待。

1、手動(dòng)集成归榕,手動(dòng)去進(jìn)行每一步的環(huán)境配置(目前不能支持插件生效):

1)引入Flutter Module模塊

打開終端尸红,進(jìn)入項(xiàng)目“Flutter_Code”的根目錄,執(zhí)行以下命令

cd Flutter_Code

flutter create -t module flutter_app

完成后刹泄,會(huì)生成名為flutter_app的文件夾外里,其和ios、android項(xiàng)目同級(jí)

2)創(chuàng)建依賴配置文件

打開iOS工程特石,在工程目錄下新建文件夾(此文件夾的位置沒有要求)盅蝗,用以保存配置文件,根據(jù)官網(wǎng)姆蘸,需要?jiǎng)?chuàng)建三個(gè)配置文件:Flutter.xcconfig墩莫、Debug.xcconfig、Release.xcconfig逞敷。如圖:


圖1


圖2

在Flutter.xcconfig中填寫:

//這里填寫建立的flutter module 的 Generated.xcconfig的路徑狂秦,添加flutter的依賴關(guān)系

#include "../flutter_module/.ios/Flutter/Generated.xcconfig"

ENABLE_BITCODE=NO

在Debug.xcconfig中填寫:

#include "Flutter.xcconfig"

在Release.xcconfig中填寫:

#include "Flutter.xcconfig"

FLUTTER_BUILD_MODE=release

Ps:如果工程中用cocopods管理,則需要在Debug.xcconfig推捐、Release.xcconfig中添加pod的路徑

準(zhǔn)備好上述xcconfig文件后裂问,需要到PROJECT中的Configurations中設(shè)置相關(guān)配置,將對(duì)應(yīng)的targer設(shè)置成前面生成的xcconfig文件牛柒,Debug選擇Debug.xcconfig堪簿,Release用Release.xcconfig。如圖:


圖3

Ps:在進(jìn)行打包時(shí)皮壁,無(wú)論是Debug還是Release椭更,都需要切換到Release.xcconfig,否則會(huì)報(bào)錯(cuò)

3)為編譯Dart引入相關(guān)腳本

在工程的Build Phase中新建一個(gè)Script Phase蛾魄,用于運(yùn)行Flutter腳本

新建Run Script Phase后甜孤,名字改為了“Flutter load”协饲,需要移動(dòng)其位置,需要在Dependencies之后(如上圖)缴川,如果用cocoapods管理工程茉稠,則需要在Check Pod項(xiàng)目后。

在”Flutter load”里把夸,在腳本框內(nèi)而线,需要寫入以下代碼,用于加載Flutter的xcode_backend腳本:

"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" build


圖4

4)修改Flutter SDK腳本:

這一步至關(guān)重要恋日,因?yàn)槊看涡薷膍ain.dart文件后膀篮,都需要Command+B后才能生效,而進(jìn)行Command+B后會(huì)生成岂膳、更新App.framework誓竿、engine、flutter_assets文件谈截,所以這三個(gè)文件的依賴關(guān)系一定要添加正確筷屡,而且要保證每次編譯工程時(shí),所依賴的這三個(gè)文件都能即時(shí)更新簸喂。

4.1)默認(rèn)情況下Xcode Run Script編譯好的Framework并不在項(xiàng)目中毙死,而在我們創(chuàng)建的flutter module文件夾下(一般路徑是./ios/Flutter/)

4.2)而在Flutter腳本代碼中有判斷,文件生成的目錄喻鳄,需要注釋掉相應(yīng)的代碼才能讓其生成在當(dāng)前的目錄中

4.3)終端執(zhí)行命令:

open $FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh

4.4)打開Flutter腳本后扼倘,注釋掉以下代碼:


圖5

5)生成、添加Framework

完成上述配置后除呵,使用Xcode編譯工程(Command+B)再菊,編譯成功后,會(huì)在iOS工程文件夾中生成一個(gè)Flutter文件夾颜曾。

項(xiàng)目中添加Flutter文件的依賴纠拔。進(jìn)入項(xiàng)目目錄,選擇Add Files to ‘xxx’依次去添加App.framework泛啸、engine、flutter_assets三個(gè)內(nèi)容秃症,

(注意:下述圖中第2步候址,“.ios”是隱藏文件,可以使用快捷鍵“Command+Shift+.”來(lái)使之顯示)

其中种柑,添加App.framework岗仑、engine兩項(xiàng)內(nèi)容時(shí),需要選擇“Copy Items If needed”聚请、“Create groups”

第三項(xiàng)荠雕,flutter_assets添加是稳其,需要選擇“Copy Items If needed”、“Create folder references”

上述操作完成后炸卑,文件夾目錄是這樣的既鞠,注意:flutter_assets是藍(lán)色文件,engine是黃色文件

然后盖文,添加App.framework嘱蛋、Flutter.framework。

注意:添加成功后將Embed選擇為“Embed & Sign”五续,否則啟動(dòng)程序會(huì)崩潰洒敏。

6)修改Generated.xcconfig文件路徑:

一般自動(dòng)生成的Generated.xcconfig中的路徑都是絕對(duì)路徑,如果更改項(xiàng)目名稱或位置疙驾,會(huì)找不到依賴的Flutter文件而導(dǎo)致編譯失敗凶伙。

解決方法:

將劃紅線部分的路徑替換為”../”,表示在flutter_module上一級(jí)的文件夾中查找對(duì)應(yīng)的路徑它碎,如圖:

圖6

接下來(lái)就是在AppDeleaget.h函荣、.m中添加相應(yīng)的代碼即可正常編譯使用。

注意:通過(guò)這種方式集成后链韭,去使用Flutter的插件時(shí)(如image_picker)偏竟,插件無(wú)法生效。這是因?yàn)椴寮枰肎eneratedPluginRegistrant文件敞峭,而目前這種方式并沒有去引用踊谋,所以插件無(wú)法生效。

擴(kuò)展:可以嘗試通過(guò)cocoapod的方式旋讹,將flutter module中的GeneratedPluginRegistrant文件進(jìn)行打包成framework殖蚕,然后引用到Native項(xiàng)目中,這樣的話這種集成方式也可以使用沉迹。

最后這一步具體如何去做睦疫,這里就不再去分析了,大家有興趣的話可以在研究一下鞭呕。

原文參考鏈接:http://www.reibang.com/p/10237bf13789


2蛤育、參考閑魚的集成方案,使用開源組件Flutter-boot集成(目前通過(guò)官網(wǎng)的操作步驟集成后無(wú)法使用)

1)下載和使用工具flutter-boot

開源地址:https://github.com/alibaba-flutter/flutter-boot

下載安裝flutter-boot必須使用npm(前端的包管理工具)葫松,常使用brew去下載瓦糕,結(jié)果不行~

使用npm的過(guò)程中可能會(huì)報(bào)錯(cuò),大家可以自行百度腋么,一般情況下重新對(duì)npm進(jìn)行更新咕娄、啟動(dòng)等操作后就OK了。

若是還無(wú)法正常安裝flutter-boot珊擂,可以嘗試在命令前加上sudo命令:

sudo npm install -g flutter-boot

2)下載成功后圣勒,通過(guò)flutter-boot去集成環(huán)境

一般情況下费变,我們直接通過(guò)終端進(jìn)入項(xiàng)目的根目錄,如這里的"Flutter_Native_0328"圣贸,里邊包含了ios挚歧、android項(xiàng)目。

此時(shí)旁趟,在終端輸入以下命令:

flutter-boot init

終端會(huì)提示輸入flutter工程名稱昼激,我們這里直接輸入"app"(經(jīng)過(guò)各種嘗試,之后將flutter module命名為“app”時(shí)锡搜,才不會(huì)報(bào)錯(cuò)橙困,可能和集成工具內(nèi)部的命名有關(guān)吧)

接著會(huì)提示輸入關(guān)聯(lián)的iOS工程等,其他的按照提示操作即可耕餐,完成后目錄結(jié)構(gòu)如圖凡傅,多出了名稱為app的flutter module

圖1

接下來(lái)的其他步驟按照官網(wǎng)知道即可。

但是我通過(guò)官網(wǎng)的知道去操作后肠缔,發(fā)現(xiàn)最終的Native項(xiàng)目(即ios項(xiàng)目)并沒有和flutter關(guān)聯(lián)起來(lái)夏跷,再下去就沒法進(jìn)行了,進(jìn)行了各種資料的查找明未、各種嘗試槽华、或者在開源社區(qū)中求助,都未能能到有效的回應(yīng)趟妥,暫時(shí)擱淺了......

不知道是不是中間哪里的操作姿勢(shì)不對(duì)猫态,有興趣的可以在研究一下flutter-boot該怎么才能正確使用。


3披摄、使用cocoapods集成

1)引入Flutter module模塊

打開終端亲雪,進(jìn)入項(xiàng)目“Flutter_Native_Mix_0330”的根目錄,執(zhí)行以下命令

cd?Flutter_Native_Mix_0330

flutter create -t module flutter_module

完成后,會(huì)生成名為flutter_app的文件夾,其和ios撑教、android項(xiàng)目同級(jí)

2)使用cocoapods

2.1)若當(dāng)前項(xiàng)目中未使用cocoapods,則先進(jìn)行安裝https://cocoapods.org(若已安裝系馆,則跳過(guò))

如果下載cocoapods失敗,排查是不是“gem”工具的問(wèn)題,一般都是簡(jiǎn)單的問(wèn)題,可以自行百度解決

我目前使用的cocoapods版本為1.9.1基显,而Flutter SDK版本是1.12

2.2)若項(xiàng)目未使用cocoapods,則進(jìn)行初始化(若已使用喳张,則跳過(guò))

進(jìn)入ios項(xiàng)目文件夾续镇,執(zhí)行命令

pod init

完成后美澳,會(huì)在ios項(xiàng)目文件夾下生成一個(gè)Podfile的文件销部。

2.3)接著摸航,打開 Podfile 這個(gè)文件,添加以下代碼

flutter_application_path = '../flutter_module/'

load File.join(flutter_application_path,'.ios','Flutter','podhelper.rb')

注意:這段代碼得寫到文件的頂部舅桩。這里使用相對(duì)路徑酱虎,不要寫絕對(duì)路徑

例如,我的Podfile文件是這樣的:

圖2

添加完成后擂涛,在終端輸入以下命令:

pod install

如圖:

圖3

會(huì)直接將Flutter的相關(guān)依賴和庫(kù)的添加到iOS項(xiàng)目中读串。

2.4)接下來(lái),打開ios項(xiàng)目撒妈,直接Command+B編譯代碼恢暖。

若當(dāng)前沒有導(dǎo)入插件,則直接編譯成功狰右。

若當(dāng)前引入了插件杰捂,并使用GeneratedPluginRegistrant初始化插件,編譯后棋蚌,發(fā)現(xiàn)報(bào)錯(cuò)了嫁佳,如下:

圖3

這是因?yàn)槭褂胏ocoapods導(dǎo)入了Flutter相關(guān)的庫(kù),需要在Build Setting->Linking->Other Linker Flags谷暮,添加 $(inherited)

圖4

這時(shí)候蒿往,能夠看到,將Flutter相關(guān)的庫(kù)導(dǎo)入了進(jìn)來(lái)湿弦,插件也導(dǎo)入了瓤漏。

此時(shí),在編譯工程省撑,發(fā)現(xiàn)可以成功運(yùn)行了赌蔑。

3)添加新的插件

3.1)添加新的插件時(shí),在pubspec.yaml中添加依賴后竟秫,進(jìn)入flutter_module目錄娃惯,在終端執(zhí)行:

flutter pub get

會(huì)將插件下載下來(lái),但是還不能立即使用肥败。需要進(jìn)入ios項(xiàng)目目錄趾浅,終端輸入命令:

pod install

執(zhí)行這個(gè)命令,相當(dāng)于更新了ios項(xiàng)目和flutter項(xiàng)目的依賴關(guān)系(新的插件引用)馒稍。更新過(guò)后皿哨,編譯ios項(xiàng)目,新的插件就可以使用了纽谒。

ps:對(duì)于這種混合項(xiàng)目证膨,建議使用flutter-boost插件來(lái)開發(fā),這個(gè)插件是閑魚的開源組件鼓黔,會(huì)解決混合開發(fā)中遇到的大部分問(wèn)題央勒,很方便

4)項(xiàng)目路徑修改為相對(duì)路徑

若是多人開發(fā)時(shí)不见,或者自己重新拉取代碼時(shí),會(huì)重新命名本地項(xiàng)目文件夾名稱崔步,此時(shí)編譯iOS項(xiàng)目會(huì)報(bào)錯(cuò)稳吮,如圖:

圖5

從這個(gè)錯(cuò)誤可以看出來(lái),我們?cè)诩傻臅r(shí)候井濒,一些編譯路徑自動(dòng)編譯為了絕對(duì)路徑灶似,我們根據(jù)報(bào)錯(cuò)的信息,找到了是在編譯以下腳本文件時(shí)瑞你,報(bào)錯(cuò)了酪惭,如圖:

圖6

我們根據(jù)路徑找到對(duì)應(yīng)的腳本文件后,打開發(fā)現(xiàn)“FLUTTER_APPLICATION_PATH”被定義為了絕對(duì)路徑者甲,如圖:

圖7

其項(xiàng)目名稱和路徑是寫死的撞蚕,因此我們把這里的路徑改為相對(duì)路徑即可,如下:

"FLUTTER_APPLICATION_PATH=../flutter_module"

除此之外过牙,我們還需要把這個(gè)路徑下“../flutter_module/.ios/Flutter/Generated.xcconfig”甥厦,Generated.xcconfig文件中的絕對(duì)路徑修改為相對(duì)路徑。

至此寇钉,我們可以隨意命名項(xiàng)目文件夾刀疙,程序都可以正常編譯。

研究了許久集成完后扫倡,就大功告成了谦秧。


4、使用Xcode集成Flutter的Framework

除了上面的方法撵溃,你也可以創(chuàng)建必備的 frameworks疚鲤,手動(dòng)修改既有 Xcode 項(xiàng)目,將他們集成進(jìn)去缘挑。當(dāng)你組內(nèi)其它成員們不能在本地安裝 Flutter SDK 和 CocoaPods集歇,或者你不想使用 CocoaPods 作為既有應(yīng)用的依賴管理時(shí),這種方法會(huì)比較合適语淘。但是每當(dāng)你在 Flutter module 中改變了代碼诲宇,都必須運(yùn)行 以下終端代碼

首先,在已經(jīng)創(chuàng)建了flutter_module的前提下惶翻,我們?cè)趇os的項(xiàng)目文件夾內(nèi)新建文件夾Flutter姑蓝,主要用來(lái)保存Flutter相關(guān)的framework。

接著吕粗,在終端執(zhí)行以下命令:

cd flutter_module

flutter build ios-framework --output=/yourPath/ios/Flutter/

參考鏈接:https://flutter.cn/docs/development/add-to-app/ios/project-setup

https://flutter.cn/docs/development/add-to-app/android/project-setup

經(jīng)歷了各種嘗試纺荧,最終還是嘗試使用cocoapods的方式來(lái)集成成功了。而且相比較來(lái)看,第一種方式步驟繁瑣宙暇,而且目前沒法有效支持插件榕茧;第二種方式雖然官網(wǎng)介紹說(shuō)簡(jiǎn)單幾步就可完成集成,但是實(shí)際操作后發(fā)現(xiàn)并不簡(jiǎn)單客给,官方介紹也含糊不清,開源社區(qū)相比較使用的人數(shù)也不多肢簿,也比較麻煩靶剑;而這第三、四種方式池充,集成的方式簡(jiǎn)單桩引,步驟少,出錯(cuò)率少收夸,兼容性高坑匠,而且靈活性也不錯(cuò)。

因此卧惜,最后兩種方式無(wú)疑是目前最好的選擇厘灼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市咽瓷,隨后出現(xiàn)的幾起案子设凹,更是在濱河造成了極大的恐慌,老刑警劉巖茅姜,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闪朱,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡钻洒,警方通過(guò)查閱死者的電腦和手機(jī)奋姿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)素标,“玉大人称诗,你說(shuō)我怎么就攤上這事⊥吩猓” “怎么了粪狼?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)任岸。 經(jīng)常有香客問(wèn)我再榄,道長(zhǎng),這世上最難降的妖魔是什么享潜? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任困鸥,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疾就。我一直安慰自己澜术,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布猬腰。 她就那樣靜靜地躺著鸟废,像睡著了一般。 火紅的嫁衣襯著肌膚如雪姑荷。 梳的紋絲不亂的頭發(fā)上盒延,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音鼠冕,去河邊找鬼添寺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛懈费,可吹牛的內(nèi)容都是我干的计露。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼憎乙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼票罐!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起泞边,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤胶坠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后繁堡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沈善,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年椭蹄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闻牡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绳矩,死狀恐怖罩润,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情翼馆,我是刑警寧澤割以,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站应媚,受9級(jí)特大地震影響严沥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜中姜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一消玄、第九天 我趴在偏房一處隱蔽的房頂上張望跟伏。 院中可真熱鬧,春花似錦翩瓜、人聲如沸受扳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)勘高。三九已至,卻和暖如春坟桅,著一層夾襖步出監(jiān)牢的瞬間华望,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工桦卒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人匿又。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓方灾,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親碌更。 傳聞我的和親對(duì)象是個(gè)殘疾皇子裕偿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容