最近入職了一家新公司,有個(gè)客戶有個(gè)需求巡莹,希望我們將原生的SDK做成Flutter插件司志,那我很榮幸的被分配到這個(gè)項(xiàng)目當(dāng)中,作為Flutter萌新降宅,感覺(jué)百度骂远、谷歌都被我翻爛了,記錄一下遇到的問(wèn)題和解決辦法腰根,好記性不如爛筆頭<げ拧!额嘿!
一開(kāi)始瘸恼,導(dǎo)入iOS端的SDK的時(shí)候位置導(dǎo)入錯(cuò)了,我以為和原生開(kāi)發(fā)一樣册养,就直接在example下面的iOS工程里面按原生的步驟導(dǎo)入使用东帅,后來(lái)我們的Flutter開(kāi)發(fā)同事(做安卓的,有接觸過(guò)Flutter球拦,就給他負(fù)責(zé)了)靠闭,告訴example在打包的時(shí)候會(huì)不見(jiàn)的帐我,我一開(kāi)始怎么都想不通,但是本著菜雞的敬畏之心愧膀,你說(shuō)啥就是啥拦键,我就開(kāi)始在外部的Flutter工程的iOS文件夾內(nèi)開(kāi)始導(dǎo)入SDK,嗚呼扇调,出問(wèn)題了矿咕,我按照網(wǎng)絡(luò)上的教程抢肛,在iOS文件夾內(nèi)新建一個(gè)framework文件夾狼钮,然后command+c,command+v將framework放進(jìn)去,再在iOS文件夾下的xxxx.podspec
中加入:
s.vendored_frameworks = 'Framework/CRPSmartBand.framework', 'Framework/OTAFramework.framework', 'Framework/RTKLEFoundation.framework', 'Framework/RTKOTASDK.framework'
就會(huì)報(bào)錯(cuò)說(shuō)no such XXXX.framework
捡絮,然后查了很多文檔和博客熬芜,改了好久都不行,最后還是靠自己蒙出來(lái)了一個(gè)解決辦法:
1.在Flutter plugin
項(xiàng)目的外層iOS目錄下福稳,與classes
同級(jí)涎拉,新增一個(gè)framework
的文件夾,將CRPSmartBand.framework
復(fù)制的圆、粘貼到該文件夾下
2.在iOS目錄下找到跟
classes
和framework
同級(jí)的 xxxplugin.podspec
文件鼓拧,雙擊打開(kāi),加上一句: s.vendored_frameworks = 'Framework/CRPSmartBand.framework'3..在項(xiàng)目目錄最下方越妈,找到
pubspec.yaml
季俩,雙擊進(jìn)入文件內(nèi),在右上角有個(gè)Pub get
梅掠,點(diǎn)擊一下4.點(diǎn)擊正下方的Terminal,cd到 example下的iOS目錄酌住,然后pod install ,pod update,完事后運(yùn)行阎抒,會(huì)報(bào)錯(cuò):
Swift Compiler Error (Xcode): Module 'OTAFramework' not found /Users/moyangkeji/Desktop/Moyoung/FlutterSDK/moyoung_ble_plugin/example/ios/.symlinks/plugins/moyoung_ble_plugin/ios/Framework/CRPSmartBand.framework/Headers/CRPSmartBand-Swift.h:187:8
因?yàn)檫€有三個(gè)庫(kù)沒(méi)導(dǎo)進(jìn)去酪我,一樣的方式,將剩下的三個(gè)庫(kù)都導(dǎo)入,同樣且叁,是要Pub get
,pod install
,別忘了:
s.vendored_frameworks = 'Framework/CRPSmartBand.framework', 'Framework/OTAFramework.framework', 'Framework/RTKLEFoundation.framework', 'Framework/RTKOTASDK.framework'
記得寫代碼和創(chuàng)建文件要在這里都哭,而不是在example的iOS里面哦
步驟都完成后,就可以在Plugin.swift里面引用framework逞带,寫代碼了欺矫,新建一個(gè)類也可以的,這個(gè)文件只是flutter告訴我們寫法
萬(wàn)萬(wàn)沒(méi)想到掰担,寫代碼的時(shí)候沒(méi)有報(bào)錯(cuò)汇陆,但是在編譯運(yùn)行的時(shí)候報(bào)錯(cuò)了,請(qǐng)?jiān)徫疫@個(gè)萌新带饱,總是會(huì)遇到問(wèn)題毡代。
Undefined symbol: type metadata accessor for CRPSmartBand.CRPSmartBandSDK
Undefined symbol: static CRPSmartBand.CRPSmartBandSDK.sharedInstance.getter : CRPSmartBand.CRPSmartBandSDK
Undefined symbol: dispatch thunk of CRPSmartBand.CRPSmartBandSDK.getMac((Swift.String, CRPSmartBand.CRPError) -> ()) -> ()
就離譜阅羹,離了大譜,我本來(lái)開(kāi)開(kāi)心心的在寫代碼了教寂,就想運(yùn)行試試API,你又告訴我你鏈接不到framework捏鱼?好吧,繼續(xù)谷歌百度酪耕,最后的最后导梆,在這篇文章找到了解決辦法
參考文章
在 xxxx.podspec 文件再加一句:
s.static_framework = true
這篇文章告訴我們,因?yàn)镕lutter有在podfile自動(dòng)開(kāi)啟了use_framework!
而開(kāi)啟了這個(gè)之后呢迂烁,pod集成的所有的庫(kù)都會(huì)以 dynamic library framework
的方式引入到工程中看尼,但是我們有一些引入的庫(kù)本來(lái)就是以靜態(tài)庫(kù)的方式存在的,就會(huì)報(bào)錯(cuò)盟步。
所以藏斩,我們需要修改對(duì)應(yīng)的 podspec
文件
記得最后一定要pub get
和 pod install