ios老工程集成flutter

老工程集成flutter有两大方法:

  1. 把xcode完全改成flutter,这种方法能实现dart代码的动态加载,但改动很大, 因为flutter引擎内部写死了xcode工程名必须是ruuner,并且需要再xcode里加入编译dart脚本
  2. 制作一个纯的flutter工程A,fluuter的开发调试都在这个工程进行,当需要发布到老工程B时,把A工程flutter编译后的平台相关的中间文件复制到B工程,B工程没有dart的调试功能,类似与基础了一个第三方的功能模块

综合考虑后使用第二种方法更加适合我们,具体流程如下

  1. 老工程导入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工程,同样添加进工程

  2. 添加framework, general->linked Frameworks: 添加app.framework和flutter.framework

  3. 添加打包资源
    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

  4. 移植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'
  1. 工程的architectures需要改成arm64,因为cocospod上的IJKMediaFramework不支持某些架构指令集

  2. 关闭Bitcode, build Settings->enable Bitcode Yes改为no

  3. 修改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, 可以正常运行

相关文章:https://yq.aliyun.com/articles/604052

你可能感兴趣的:(ios老工程集成flutter)