Flutter
已经融入工程有一段时间了,因为团队人数较少,因此一直没有管和原有工程解依赖的问题,今天有时间正好把这个问题给搞了。android
首先,直接忽略上一篇《接入现有iOS项目》的全部步骤,直接建立flutter_module
工程ios
flutter create flutter_module
注:
flutter create flutter_module
和flutter create -t module my_flutter
区别在于带module
参数,建立出来的工程会把辅助用的android
,ios
工程给隐藏掉,咱们这里要涉及打包以及修改配置,就不须要带module
参数了git
其次,弄明白一件事官方wiki,里面用的两个脚本podhelper.rb
和xcode_backend.sh
分别在Podfile
和Build Phases
里面github
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
这两个脚本的做用时什么呢?shell
1.podhelper.rbxcode
这个脚本主要作了三件事:app
Flutter.framework
(Flutter引擎),以及Flutter
的插件注册表FlutterPluginRegistrant
(建立的工程中GeneratedPluginRegistrant.{h,m}
文件中).flutter-plugins
的依赖Generated.xcconfig
配置,这里面放的是Flutter
要用的环境变量(如:xcode_backend.sh
开头就要用的$FLUTTER_ROOT
)这里面最重要的就是Flutter.framework
ui
2.xcode_backend.sh插件
这个脚本本来是放在Build Phases
,在Debug
和Release
模式下分别会产出对应环境的Flutter
产物(Flutter
有Debug
,Profile
,Release
三个模式)。而且里面还有一句代码是:code
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.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
修改工程下的Podfile
:
pod "FlutterModule", :path => "../flutter_product"
注:我这里直接用的本地路径引入的(主要仍是懒),团队开发应该是放在本身的私有pod库上。
至此,依赖就解决了,Native
同窗不须要关心Flutter
模块,也不须要搭建Flutter
环境,就能够开发了。而负责Flutter
模块的同窗也能够经过独立的工程单独开发,固然在大型团队开发过程当中还有不少事情要作,这里只是第一步,后续把Plugin
项目完成后出一篇完整文章。