老工程集成flutter有两大方法:
- 把xcode完全改成flutter,这种方法能实现dart代码的动态加载,但改动很大, 因为flutter引擎内部写死了xcode工程名必须是ruuner,并且需要再xcode里加入编译dart脚本
- 制作一个纯的flutter工程A,fluuter的开发调试都在这个工程进行,当需要发布到老工程B时,把A工程flutter编译后的平台相关的中间文件复制到B工程,B工程没有dart的调试功能,类似与基础了一个第三方的功能模块
综合考虑后使用第二种方法更加适合我们,具体流程如下
老工程导入flutter相关文件
a. 首先编译纯flutter工程A(命令行flutter build ios –release)
b. 把A工程ios/Flutter文件夹复制到老的非Flutter B工程
c. B工程把复制过来的Flutter目录作为group添加进工程(先新建一个Flutter group,然后把sdk包里的Flutter目录复制到工程的Flutter,然后再在工程中添加文件, Flutter是黄色的, flutter_assets是绿色的, build->phases->copy bundle resource下自动添加flutter_assets目录,而不是里面的文件)
d.复制A工程中的GeneratedPluginRegistrant.h/mm到B工程,同样添加进工程添加framework, general->linked Frameworks: 添加app.framework和flutter.framework
添加打包资源
a.Build Phases->Copy Bundle Resources下添加flutter_assets,这个目录保护所有的flutter脚本和资源
b.Build Phases下点”+”创建一个New Copy Files Phase,Destination选择Frameworks, name下添加app.framework和flutter.framework, 这步不成功提示找不到flutter image移植flutter pod,flutter的插件一般在ios下是个xcode工程,所以需要在podfile中引入本地的这个插件工程:
第一步:在flutter下安装这个插件,使得插件xcode下载到本地 一般在flutter/.pub-cache/hosted/pub.dartlang.org/下
第二步:编辑Podfile文件引入这个本地的xcode插件,类似
pod 'shared_preferences', :path => '/Users/zt-2012498/Desktop/data/software/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences-0.4.2/ios'
工程的architectures需要改成arm64,因为cocospod上的IJKMediaFramework不支持某些架构指令集
关闭Bitcode, build Settings->enable Bitcode Yes改为no
修改B工程代码
a.创建一个ViewControllor视图,基类为FlutterViewController,默认的空类即可,这个view将用于后面给flutter渲染, flutter内的界面切来切去对于原生而言都是在这个view内显示的画面而已
a.修改AppDelegate.h 把appDelegate的基类改成FlutterAppDelegate
b.修改AppDelegate.m 在didFinishLaunchingWithOptions函数内添加
self.window.rootViewController = view;
//执行registerWithRegistry时window.rootViewController必须是flutterViewController的子类,否则插件通信受印象
//参考[图片]FlutterAppDeleate.mm binaryMessager函数
[GeneratedPluginRegistrant registerWithRegistry:self];
self.window.rootViewController = nc; //执行registerWithRegistry后就可以改成自己需要的rootView了
[self.window makeKeyAndVisible];
return [super application:application didFinishLaunchingWithOptions:launchOptions];
- 第一步的A工程可以是release而B工程可以是debug, 可以正常运行