最近入职了一家新公司,有个客户有个需求,希望我们将原生的SDK做成Flutter插件,那我很荣幸的被分配到这个项目当中,作为Flutter萌新,感觉百度、谷歌都被我翻烂了,记录一下遇到的问题和解决办法,好记性不如烂笔头!!!
一开始,导入iOS端的SDK的时候位置导入错了,我以为和原生开发一样,就直接在example下面的iOS工程里面按原生的步骤导入使用,后来我们的Flutter开发同事(做安卓的,有接触过Flutter,就给他负责了),告诉example在打包的时候会不见的,我一开始怎么都想不通,但是本着菜鸡的敬畏之心,你说啥就是啥,我就开始在外部的Flutter工程的iOS文件夹内开始导入SDK,呜呼,出问题了,我按照网络上的教程,在iOS文件夹内新建一个framework文件夹,然后command+c,command+v将framework放进去,再在iOS文件夹下的xxxx.podspec
中加入:
s.vendored_frameworks = 'Framework/CRPSmartBand.framework', 'Framework/OTAFramework.framework', 'Framework/RTKLEFoundation.framework', 'Framework/RTKOTASDK.framework'
就会报错说no such XXXX.framework
,然后查了很多文档和博客,改了好久都不行,最后还是靠自己蒙出来了一个解决办法:
1.在Flutter plugin
项目的外层iOS目录下,与classes
同级,新增一个framework
的文件夹,将CRPSmartBand.framework
复制、粘贴到该文件夹下
2.在iOS目录下找到跟
classes
和framework
同级的 xxxplugin.podspec
文件,双击打开,加上一句: s.vendored_frameworks = 'Framework/CRPSmartBand.framework'image.png
3..在项目目录最下方,找到
pubspec.yaml
,双击进入文件内,在右上角有个Pub get
,点击一下image.png
4.点击正下方的Terminal,cd到 example下的iOS目录,然后pod install ,pod update,完事后运行,会报错:
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
因为还有三个库没导进去,一样的方式,将剩下的三个库都导入,同样,是要Pub get
,pod install
,别忘了:
s.vendored_frameworks = 'Framework/CRPSmartBand.framework', 'Framework/OTAFramework.framework', 'Framework/RTKLEFoundation.framework', 'Framework/RTKOTASDK.framework'
记得写代码和创建文件要在这里,而不是在example的iOS里面哦
步骤都完成后,就可以在Plugin.swift里面引用framework,写代码了,新建一个类也可以的,这个文件只是flutter告诉我们写法
image.png
万万没想到,写代码的时候没有报错,但是在编译运行的时候报错了,请原谅我这个萌新,总是会遇到问题。
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) -> ()) -> ()
就离谱,离了大谱,我本来开开心心的在写代码了,就想运行试试API,你又告诉我你链接不到framework?好吧,继续谷歌百度,最后的最后,在这篇文章找到了解决办法
参考文章
在 xxxx.podspec 文件再加一句:
s.static_framework = true
这篇文章告诉我们,因为Flutter有在podfile自动开启了use_framework!
而开启了这个之后呢,pod集成的所有的库都会以 dynamic library framework
的方式引入到工程中,但是我们有一些引入的库本来就是以静态库的方式存在的,就会报错。
所以,我们需要修改对应的 podspec
文件
记得最后一定要pub get
和 pod install
网友评论