博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Flutter 存量iOS应用接入Flutter
阅读量:3554 次
发布时间:2019-05-20

本文共 3665 字,大约阅读时间需要 12 分钟。

我喜欢回顾,是因为我不喜欢忘记。我总认为,在世间,有些人、有些事、有些时刻似乎都有一种特定的安排,在当时也许不觉得,但是在以后回想起来,却都有一种深意。我有过许多美丽的时刻,实在舍不得将它们忘记。

前言

本篇文章基于上一篇博文:

由于目前Flutter处于新生阶段,因此如果要使用,应该是逐步演进的过程,即Native逐步集成Flutter,并完成逐步的Flutter化。

Debug集成方案

Flutter提供的官方接入方案:,值得一提的是官方在Flutter 1.12上提供了Android Studio直接接入Flutter的方案。

  • Debug集成方案便于调试,直接可以源码级别调试和开发,方便查问题。(Flutter插件同理)

Native依赖Flutter分析

根据上一章节的内容可知,Native依赖Flutter的最核心内容就是依赖Flutter Engine(Flutter.framework)、解析并依赖Flutter插件、以及依赖Flutter的业务层代码(App.framework)。

Native Pod Install Flutter

因此,在Native工程中直接开发、调试Flutter插件的配置流程为:

  • 分析Generated.xcconfig获取FLUTTER_ROOT
  • 依赖Flutter Engine
  • 依赖Flutter业务代码
  • 依赖Flutter插件注册库
  • 依赖Flutter插件
  • 设置Bitcode为false

因此,Native工程依赖Flutter的podhelper.rb将要包含以上的部分。

接入流程

修改xcode_backend.sh

在Flutter 1.9.1版本中,需要修改这个脚本。其他版本暂时不清楚。

  • vim $FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh
--- a/packages/flutter_tools/bin/xcode_backend.sh+++ b/packages/flutter_tools/bin/xcode_backend.sh@@ -141,7 +141,7 @@ BuildApp() {
mkdir "${derived_dir}/engine" RunCommand cp -r -- "${flutter_podspec}" "${derived_dir}/engine" RunCommand cp -r -- "${flutter_framework}" "${derived_dir}/engine"- RunCommand find "${derived_dir}/engine/Flutter.framework" -type f -exec chmod a-w "{}" \;+ RunCommand find "${derived_dir}/engine/Flutter.framework" -type f -iname '.h' -exec chmod a-w "{}" \; else RunCommand rm -rf -- "${derived_dir}/Flutter.framework" RunCommand cp -r -- "${flutter_framework}" "${derived_dir}"

工程层级结构

  • 要确保Flutter工程(app)和Native工程(Android、iOS)在同级目录下。
➜  temp tree -L 1.├── Android├── flutter_module└── iOS3 directories, 0 files

修改iOS/Podfile

ios/Podfile中使用app/flutter_podhelper.rb

# 配置Flutter Module的目录flutter_application_path = '../flutter_module'# 加载.ios/Flutter/podhelper.rb来注入依赖load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')target 'MyApp' do  # 依赖注入:Flutter引擎、Flutter业务代码、Flutter插件依赖  install_all_flutter_pods(flutter_application_path)end
  • 如果不懂install_all_flutter_pods(flutter_application_path),详见上一篇文章。

编译Flutter产物

app目录下执行增加以下build.sh

# !/bin/sh# 当前目录为appecho "当前路径为:`pwd`" # 先清除.ios和.androidflutter clean# 拉包flutter pub getflutter packages get# 安装依赖cd .ios  # 从当前目录为app进入.ios# 插件依赖pod install --verbose --no-repo-updatecd ../   # 从当前目录为app/.ios退出# 编译flutter build ios

然后在flutter_module目录下,执行./build.sh,等待编译产物成功。

➜  flutter_module flutter build iosBuilding com.wtfexample.flutterModule for device (ios-release)...Found saved certificate choice "Apple Development: xxxxxxxx@gmail.com (xxxxxxxx)". To clear, use"flutter config".Signing iOS app for device deployment using developer identity: "Apple Development:xxxxxxxx@gmail.com (xxxxxxxx)"Running Xcode build... ├─Building Dart code...                                    20.0s ├─Generating dSYM file...                                   0.3s ├─Stripping debug symbols...                                0.0s ├─Assembling Flutter resources...                           0.7s └─Compiling, linking and signing...                         3.9sXcode build done.                                           29.6sBuilt /Users/.../flutter_module/build/ios/iphoneos/Runner.app.

依赖产物

iOS工程执行pod install --verbose --no-repo-update即可完成依赖注入。

Native与Flutter互调

  • 这里可以看看官方的实现:
  • 也推荐使用闲鱼推出的方案

Release集成方案

Release依赖的方案基于Debug集成方案,只需要将Flutter的引擎、Flutter业务层代码、FlutterPluginRegistrant、Flutter插件及其依赖编译成静态库,通过pod集成即可。

pod 'Flutter', :git => GitPath, :tag => GitTagpod 'FlutterApp', :git => GitPath, :tag => GitTagpod 'FlutterPluginRegistrant',  :git => GitPath,:tag => GitTag
模块 说明
Flutter Flutter引擎
FlutterApp Flutter业务层代码及其资源文件
FlutterPluginRegistrant Flutter插件注册制,包含了Flutter插件
  • 更多请见这篇文章分析,如何制作iOS端的Flutter产物方案。
    • 该脚本说明了如何制作这些静态库的方案,后续仅仅需要将静态库上传到Podspec等的静态产物托管平台即可。

附录

转载地址:http://aqzrj.baihongyu.com/

你可能感兴趣的文章
操作系统知识整理
查看>>
实现自己的权限管理系统(二):环境配置以及遇到的坑
查看>>
实现自己的权限管理系统(四): 异常处理
查看>>
实现自己的权限管理系统(十):角色模块
查看>>
实现自己的权限管理系统(十二):权限操作记录
查看>>
实现自己的权限管理系统(十三):redis做缓存
查看>>
实现自己的权限管理系统(十四):工具类
查看>>
JavaWeb面经(二):2019.9.16 Synchronized关键字底层原理及作用
查看>>
牛客的AI模拟面试(1)
查看>>
深入浅出MyBatis:MyBatis解析和运行原理
查看>>
Mybatis与Ibatis
查看>>
字节码文件(Class文件)
查看>>
java中的IO流(一)----概述
查看>>
StringBuilder
查看>>
集合,Collection
查看>>
泛型详解
查看>>
泛型实现斗地主
查看>>
List集合
查看>>
ArrayList集合,LinkedList集合,Vector集合
查看>>
HashSet集合
查看>>