Flutter
已經融入工程有一段時間了,由於團隊人數較少,所以一直沒有管和原有工程解依賴的問題,今天有時間正好把這個問題給搞了。
一、分析
首先,直接忽略上一篇《接入現有iOS項目》的所有步驟,直接創建flutter_module
工程
flutter create flutter_module
注:
flutter create flutter_module
和flutter create -t module my_flutter
區別在於帶module
參數,創建出來的工程會把輔助用的android
,ios
工程給隱藏掉,我們這里要涉及打包以及修改配置,就不需要帶module
參數了
其次,弄明白一件事官方wiki,里面用的兩個腳本podhelper.rb
和xcode_backend.sh
分別在Podfile
和Build Phases
里面
flutter_application_path = '../my_flutter/'
eval(File.read(File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')), binding)
"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" build
"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" embed
這兩個腳本的作用時什么呢?
1.podhelper.rb
這個腳本主要做了三件事:
- 通過Pod引入
Flutter.framework
(Flutter引擎),以及Flutter
的插件注冊表FlutterPluginRegistrant
(創建的工程中GeneratedPluginRegistrant.{h,m}
文件中) - 引入
.flutter-plugins
的依賴 - 導入
Generated.xcconfig
配置,這里面放的是Flutter
要用的環境變量(如:xcode_backend.sh
開頭就要用的$FLUTTER_ROOT
)
這里面最重要的就是Flutter.framework
2.xcode_backend.sh
這個腳本原本是放在Build Phases
,在Debug
和Release
模式下分別會產出對應環境的Flutter
產物(Flutter
有Debug
,Profile
,Release
三個模式)。並且里面還有一句代碼是:
RunCommand cp -r -- "${app_framework}" "${derived_dir}"
我們現在把flutter
模塊獨立了,於是在Debug
的時候執行flutter run
或者打包執行flutter build ios
都會在ios/Flutter文件夾下產生一些文件,其中App.framework
和flutter_assets
是我們最關心的。
也就是說xcode_backend.sh
的作用是:
在Debug
和Release
下構建出對應的Flutter
產物,App.framework
,flutter_assets
(App.framework
就是我們在lib下面寫的Dart代碼,flutter_assets
就是我們資源)
把上面的產物拷貝到App包里
那么我們也得出了相應的結論,要解除依賴,就是需要把關鍵的三個文件拆出來就可以了:
Flutter.framework
App.framework
flutter_assets
當然如果有FlutterPlugin
則還需要FlutterPluginRegistrant
,這個我們后面講。
二、創建產物工程flutter_product
把Flutter.framework
、App.framework
、flutter_assets
三個文件拷貝到這個工程。
注:一定要對應好
Xcode
和Flutter
的模式,如果Xcode
是Debug
,那么需要Debug
模式的Flutter
產物,即:flutter run
出來的App.framework
和flutter_assets
,Xcode
是Release
則需要flutter build ios
出來的App.framework
和flutter_assets
。這個后續可以寫個shell
腳本來搞定。
編寫**podspec**
文件:
Pod::Spec.new do |s|
s.name = "FlutterModule"
s.version = "0.0.1"
s.summary = "A short description of FlutterModule."
s.description = "FlutterModule"
s.homepage = "http://EXAMPLE/FlutterModule"
s.license = "MIT"
s.author = { "goingta" => "tanglei@doctorwork.com" }
s.source = { :git => "", :tag => "#{s.version}" }
#s.source_files = 'Classes','Classes/**/*.{h,m}'
s.vendored_frameworks = ['Module/App.framework','Module/Flutter.framework']
s.resource = ['Module/flutter_assets']
end
三、通過Pod引入Xcode工程
修改工程下的Podfile
:
pod "FlutterModule", :path => "../flutter_product"
注:我這里直接用的本地路徑引入的(主要還是懶),團隊開發應該是放在自己的私有pod庫上。
至此,依賴就解決了,Native
同學不需要關心Flutter
模塊,也不需要搭建Flutter
環境,就可以開發了。而負責Flutter
模塊的同學也可以通過獨立的工程單獨開發,當然在大型團隊開發過程中還有很多事情要做,這里只是第一步,后續把Plugin
項目完成后出一篇完整文章。