我们一般开发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
运行即可
网友评论