flutter 混合工程自动化(一)
我们一般开发flutter与原生项目混合开发,需要flutter工程向原生提供一个flutter module,然后将原生工程下新建一个Podfile,并将其修改一下
# Uncomment the next line to define a global platform for your project
flutter_application_path = '../flutter_module'
load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')
platform :ios, '9.0'
target 'NativeDemo' do
install_all_flutter_pods(flutter_application_path)
use_frameworks!
# Pods for NativeDemo
end
然后pod install
然后就可以在iOS工程里面开发了
FlutterViewController* vc = [FlutterViewController new];
[self presentViewController:vc animated:YES completion:nil];
但是这样做会有个问题,Native工程师会存在一下三个问题:
1,需要flutter环境
2,flutter版本必须与flutter开发人员一致
3,flutter的安装路径也必须一致
普通的混合工程
所以需要混合工程自动化来解决这个问题,早期的flutter开发工程师需要手动的去抽取.ios文件夹下的App.framework与Flutter.framework,但是在flutter 1.12之后,flutter已经支持快捷命令来抽取,具体过程如下:
1.flutter工程师需要:
flutter build ios-framework --output=../flutter_app
在flutter_app文件夹下会生成三个子文件夹
Debug:调试版本,可以运行在模拟器
Profile:高性能的调试版本,只支持真机
Release:发布版本,只支持真机
他们文件夹下分别都会有App.framework与Flutter.framework,提供对应的版本给原生工程师即可
2.原生工程师需要:
1.导入flutter_app文件夹
2.修改target的build settings下的Framework Search Paths
在里面添加$(PROJECT_DIR)/flutter_app/Debug
3.在工程里新建一个group名字叫Frameworks
4.将App.framework与Flutter.framework脱出Frameworks文件夹下
选中copy if needed
这样原生工程师在没有flutter环境的情况下照样可以运行flutter 代码。
但是如上方法是有缺陷的,因为对于iOS开发者,每次都需要去拉去Flutter.framework,但是Flutter.framework的更新频率相对较低,而App.framework更新频率相对较高。而且,iOS工程大部分都已经拥有Cocopods了,所以我们可以用Cocopods混合工程。
Cocoapods混合工程
在终端输入
flutter build ios-framework --cocoapods --output=../flutter_app
那么Flutter文件夹下同样会生成Debug,Profile,Release三个文件夹,不同的是里面只有App.framework,于此同时,里面会多一个Flutter.podspec文件,这个Flutter.podspec文件就是用来接入原生工程的。
在Podfile里面增加一条
pod 'Flutter', :podspec=>'Flutter/Debug/Flutter.podspec'
然后pod install
将App.framework拖入Framework文件夹下
将Target->General下的Frameworks,Libraries,and Embedded Content 种的App.framework 的状态改为embed & sign
然后用Xcode运行即可