首先聲明一點,flutter的插件已經有不少了,官方的插件,去這里找https://github.com/flutter/plugins
第三方的插件,去這里找https://pub.dev/, (這個網站有時候打不開,感覺應該是服務器的問題,請耐心多刷新幾次嘍),
但是難免有時候還是要自己去寫插件,俗稱自定義插件,才能滿足自己項目的需要.
比方說,在原生工程里面是用 合作公司的SDK開發了一個視頻模塊 (SDK是封裝好的頭文件和一些.a靜態庫), 假如現在flutter工程里面也想要這個視頻模塊,那怎么辦,這個時候就需要寫插件了,寫視頻的插件了. 當然各位有更好的辦法解決此需求,麻煩請告知我嘍~~
言歸正傳,我們還是回到怎么寫自定義插件.我決定從簡單到復雜來一一介紹
簡單的--->插件里面只調用到原生自帶的api,
當我們新建一個插件工程的時候,官方就給我們提供了一個示例, 獲取手機的版本號.這個示例就是屬于此類. 只用原生自帶的一些api,就可以完成.
點擊Android Studio 新建一個插件工程,
然后就是下一步,下一步的事情了,建完以后發現有問題,打不開原生工程 翻車了~~
注意觀察哦,沒有android,也沒有iOS相關的東西;還有一點就是 右鍵沒法用xcode打開了;
來來來,現在我們來看一下flutter 1.20 版本之前的版本建完以后是這樣的
右鍵是可以用xocode打開原生工程的
現在我們來填坑
我們還是按官方文檔來解決此坑吧,
官方地址:https://flutter.dev/docs/development/packages-and-plugins/developing-packages#plugin-platforms
其中這個地方有提到怎么創建插件工程
其中插件工程名為hello. 現在我們要創建一個工程PlugTest1,所以用下面的命令
1.打開終端,cd 到你要的位置,比喻我就放到桌面
cd Desktop/
2.把上面的語句改一下
flutter create --org com.example --template=plugin --platforms=android,ios -i objc plugTest1
其中 參數 objc 表示iOS工程將會是用Objective-C語言來編寫代碼,對應安卓的是java;
同理如果把objc 換成swift,表示iOS工程將會是用swift語言來編寫代碼,對應安卓的是kotlin;
3.接著運行
flutter run
就會正常的跑起來.至此新建一個插件工程的坑填完(此坑是flutter 升級為1.20后才會出現的).
如下圖的路徑,就能找到插件實現的核心代碼(iOS Android)
回到正題
此簡單插件實現,只調用到原生自帶的api
iOS
Android
中等---->還會用到一些第三方的文件或者說是用到了第三方庫
例如我之前寫的一篇文章,關于實現udp掃描的插件,http://www.lxweimin.com/p/803660ad39de
就是屬于此類,有興趣的可以看看上面鏈接的那篇文章.
不過在此 我還是從零開始帶著大家看看,首先用上面的方法新建一個叫 plugUdp的插件
cd Desktop/
flutter create --org com.example --template=plugin --platforms=android,ios -i objc plugUdp
flutter run
建完之后是這樣的,可以正常運行起來
這里我以iOS為例,同樣的右鍵,用xcode打開原工程
想在xcode里面找到PlugUdpPlugin.h,PlugUdpPlugin.m還是不容易的,路徑比較深的,這里我為了方便大家,把路徑的圖留下來了
回到正題
寫udp插件,我是用到了GCDAsyncSocket這個庫在iOS里面處理socket相關的比較容易,他有幾個文件,我們現在要把它放在哪里呢,
經過多番測試是放在Classes里面是可以的.可以正常用起來
但是flutter 升級為1.20后,又不行了
我們來填坑 (重點就在這里,后面復雜一點的配置也是以此為基礎的)
1.回到android studio下plugUdp插件工程, 在iOS文件夾下面新建一個文件夾,比喻Frameworks,把需要的文件放在Frameworks文件夾里面
2.配置podspec文件,把.h .m文件路徑配置進去
3.打開終端,cd到工程目錄下的plugUdp/example/ios下,里面有podfile文件
cd /Users/XXXXXX/Desktop/plugUdp/example/ios
4.在終端 安裝一下
pod install
5.再右鍵用xcode打開原生工程
你會發現多了一個叫Frameworks的文件夾,并且里面有相應的文件.
在PlugUdpPlugin.h 試著引入頭文件,是正常,并且使用它,
在PlugUdpPlugin.m調用它里面的方法,也是正常的.
此到大功告成, 坑已填完.
有難度--->插件里面用到 第三方封裝好的sdk,(有framework,有.h頭文件,有.a靜態庫等)
怎么在插件里面導入第三方封裝好的Framework,并且能正常使用它,還有些難度的.說得更清楚一些就是怎么配置podspec文件.
關于怎么配置podspec文件 我們再來一個實例
1.新建一個plugvideo的插件(前面已經多次用到了,不再贅述),用android studio打開插件工程;
2.在ios文件夾下,新建一個frameworks文件夾,再把.a /.framework文件放進去,把.h /.m文件放到Classes文件夾(如下圖第一圖)
3.配置podspec(如下圖第一圖)
4.找到plugvideo插件工程目錄下的podfile文件,進行pod install(前面有提到,可以回頭看上面)
5.右鍵用xcode打開原生工程,
6.驗證一下是否正常(如下圖第二圖)
最后附上podspec配置遵循的規則
Pod::Spec.new do |s|
s.name = "XXXSDK"
s.version = "1.0.0"
s.summary = "這是一個SDK"
s.description = "這是一個SDK 一定要比summary長."
s.homepage = "https://github.com/xxxx/XXXSDK"
s.license = { :type => "MIT", :file => "LICENSE" }
s.author = { "作者" => "123456@qq.com" }
s.platform = :ios, "8.0"
# When using multiple platforms ios部署版本
# s.ios.deployment_target = "5.0"
# s.osx.deployment_target = "10.7"
#1 git commit -m =>"13287dd",講pod版本與git倉庫中的某一次提交綁定
#s.source = { :git => "https://github.com/xxxx/XXXSDK", :commit => "13287dd" }
#2 將這個Pod版本與Git倉庫中某個版本的comit綁定
#s.source = { :git => "https://github.com/xxxx/XXXSDK", :tag => 1.0.0 }
#3 將這個Pod版本與Git倉庫中相同版本的comit綁定
#s.source = { :git => "https://github.com/xxxx/XXXSDK", :tag => s.version }
s.source = { :git => "https://github.com/xxxx/XXXSDK.git", :tag => "v#{s.version}" }
s.source_files = "XXXSDK", "XXXSDK/openSource/*.{h,m}"
s.vendored_frameworks = 'XXXSDK/lib/XXXSDK.framework'
s.resources = "XXXSDK/resource/resource.bundle"
s.framework = "UIKit"
#s.resource = "XXXSDK/resource/resource.jpg"
#s.frameworks = "SomeFramework", "AnotherFramework"
#引用libxml2.lib和libz.lib、tbd ,去掉頭尾的lib
# s.library = "z"
# s.libraries = "z", "xml2"
#s.vendored_libraries = 'XXXSDK/lib/XXXSDK.a'
s.requires_arc = true
# s.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" }
# s.dependency "JSONKit", "~> 1.4" s.dependency = 'AFNetworking', '~> 2.3' s.dependency = 'SDWebImage'
# 創建子庫
#s.subspec 'Components' do |ss|
#ss.source_files = 'YDKit/Components/*/.{h,m}'
#end
end
###以下是上面代碼的功能注解
s.name:
名稱
pod search 搜索的關鍵詞,一定要和.podspec的名稱一樣,否則報錯
s.version:
版本號
s.ios.deployment_target:
支持的pod最低版本
s.summary:
簡介
s.homepage:
項目主頁地址
s.license:
開源協議(創建github庫的時候選擇的)
s.author:
作者信息(這里隨便謝謝也可以通過)
s.social_media_url:
社交網址
s.source:
項目的地址
s.source_files:
需要包含的源文件
s.resource:
資源文件,單個
s.resources:
資源文件(含bundle)
s.vendored_frameworks:
包含的framework,也就是我們自己制作的pod
s.requires_arc:
是否支持ARC
s.dependency:
依賴庫,不能依賴未發布的庫.如AFNetWorking
s.description:
描述,字數要比s.summary長
s.screenshots:
截圖
s.exclude_files:
隱藏的文件
s.public_header_files:
公開的頭文件
s.framework:
所需的framework,單個
s.frameworks:
所需的framework,多個用逗號隔開
s.library
引用的靜態庫
s.libraries
引用的靜態庫,多個用逗號隔開
s.vendored_libraries:
引用自己生成的.a
s.vendored_frameworks:
引用自己生成的.framework,多個用逗號隔開
s.dependency:
依賴的庫
s.ios.deployment_target
iOS部署版本
結尾
關于插件這塊,因為涉及的東西比較多,所以本來就是有點復雜.遇到坑后,就感覺更難了,這個時候,就需要耐心啦.就像看這篇文章一樣,要有耐心把它看完,一邊看,一邊動手做,多練幾次,相信會有收獲的~ 祝君好運~~~
如果覺得有點幫助,請點贊加關注哦~