相信很多使用原生+Flutter的iOS项目都会遇到混合开发的集成问题,也有大神写了一些解决方案,下面就记录一下我的心路历程:

前期准备

开始之前,我先拜读了一些大神的文章(这里只挑出对我帮助最大的):

Flutter混合开发组件化与工程化架构

混沌初始,iOS现有项目集成Flutter

方案筛选

经过探索,结合项目的实际情况(我司的项目采用模块化开发,pods方式集成),有下面的两个方案:

  • 使用google的集成方案
  • 将flutter编译后的产物打包到一个新的子模块中,并在其中实现对应的接口和交互逻辑。

无论是从使用方便的角度还是对代码的侵入程度来看,采用方案2都是顺理成章的。

实现方式

写脚本之前,先来看看打包步骤(其实就是收集编译产物)

打包步骤

打包的步骤如下:

1、flutter build ios。

2、进入对应flutter项目的../ios(或者.ios)/Flutter/文件夹,找到App.framwork和Flutter.framework以及FlutterPluginRegistrant文件夹,拷贝到子模块中。

3、进入对应flutter项目的build/ios/Debug-iphoneos(或者Release-iphoneos),拷贝各个依赖库的.a文件到子模块中。

4、如果项目有依赖到第三方的插件(一般来说都会有),需要根据.flutter-plugins文件中的路径到对应模块的源代码的ios/Classes中拷贝各个依赖库的.h文件(这一步可以说是相当繁琐了)。

使用自动化脚本执行上面的操作

以下代码均在flutter工程的目录下操作(请确保flutter的插件没有源码依赖):

首先是打包:

echo "===清理flutter历史编译==="
flutter cleanecho "===重新生成plugin索引==="
flutter packages getecho "===生成App.framework和flutter_assets==="
flutter build ios --debug
# 或者 flutter build ios --release
复制代码

然后是拷贝App.framework和Flutter.framework:

framework_dir=...
echo "===copy App.framework和Flutter.framework==="
cp -r "./.ios/Flutter/App.framework" $framework_dir
cp -r "./.ios/Flutter/engine/Flutter.framework" $framework_dir
复制代码

拷贝注册器:

classes_dir=...
echo "===copy注册器:FlutterPluginRegistrant==="
regist_dir="./.ios/Flutter/FlutterPluginRegistrant/Classes/"
model_class=${classes_dir}/flutter/FlutterPluginRegistrant
mkdir -p $model_class
cp -r $regist_dir $model_class
复制代码

接下来是各个插件的拷贝,这里有一个小坑,由于各个插件是被打包成.a的形式进行引入,那么很可能导致模拟器上无法运行的问题,需要打一个真机包和一个模拟器包,并将它们进行合并,才能在使用过程中用模拟器进行调试:

# 合成的.a文件缓存temp_dir=...mkdir -p ${temp_dir}current_path="$PWD"
# 执行clean并重新编译pods部分
cd .ios/Pods/usr/bin/env xcrun xcodebuild clean/usr/bin/env xcrun xcodebuild build -configuration Release ARCHS='arm64 armv7' BUILD_AOT_ONLY=YES VERBOSE_SCRIPT_LOGGING=YES -workspace Runner.xcworkspace -scheme Runner BUILD_DIR=../build/ios -sdk iphoneos# 遍历.flutter-plugins文件
cat .flutter-plugins | while read linedoarray=(${line//=/ })plugin_name=${array[0]}echo "===修改注册器(修正引用)==="perl -pi -e "s|\<${plugin_name}\/|\"|g" ${model_class}/GeneratedPluginRegistrant.mperl -pi -e "s|.h\>|.h\"|g" ${model_class}/GeneratedPluginRegistrant.mtemp_library=${temp_dir}/lib${plugin_name}.aecho ">>>生成lib${plugin_name}.a<<<"cd .ios/Pods/usr/bin/env xcrun xcodebuild build -configuration Release ARCHS='arm64 armv7' -target ${plugin_name} BUILD_DIR=../../build/ios -sdk iphoneos -quiet/usr/bin/env xcrun xcodebuild build -configuration Debug ARCHS='x86_64' -target ${plugin_name} BUILD_DIR=../../build/ios -sdk iphonesimulator -quietecho ">>>合并lib${plugin_name}.a<<<"lipo -create "../../build/ios/Debug-iphonesimulator/${plugin_name}/lib${plugin_name}.a" "../../build/ios/Release-iphoneos/${plugin_name}/lib${plugin_name}.a" -o $temp_librarycd $current_pathif [[ -f "$temp_library" ]]; thenecho "===copy ${plugin_name}==="plugin=${framework_dir}/${plugin_name}rm -rf $pluginmkdir -p $plugincp -f $temp_library $pluginclasses=${array[1]}ios/Classesclass=$dest_dir/Classes/flutter/${plugin_name}rm -rf $classmkdir -p $classfor header in `find "$classes" -name *.h`; docp -f $header $classdonefidonerm -rf ${temp_dir}
fi
复制代码

可能你会注意到上面的===修改注册器(修正引用)===内容,这是由于我们将flutter的插件部分的文件直接打包成静态库,并将其.h文件全部导入到模块内部了,因此自动生成的#import <xxx/xxx.h>模式不适用了(会报错哟),需要改成#import "xxx.h"的形式进行引用。

到此,flutter的自动打包脚本基本完成,上面的各个文件路径需要根据实际情况进行调整,改为适合自己的项目的路径。

希望这篇能够帮助大家少走弯路。

转载于:https://juejin.im/post/5cf734a6f265da1b6d401311

【Flutter】如何写一个Flutter自动打包成iOS代码模块的脚本相关推荐

  1. 【Node.js】写一个数据自动整理成表格的脚本

    前言 企业项目进行数据埋点后,埋点事件名需要整理成Excel表格便于统计,目标是将下图左侧数据转化成下图右侧的Excel表格: 考虑到左侧埋点数据是随项目迭代增加的,埋点数据每增加一次我就要把数据一条 ...

  2. 用Python写一个将Python2代码转换成Python3代码的批处理工具

    之前写过一篇如何在windows操作系统上给.py文件添加一个快速处理的右键功能的文章:<一键将Python2代码自动转化为Python3>,作用就是为了将Python2的文件升级转换成P ...

  3. 在Android studio里写一个Flutter程序

    在Android studio里写一个Flutter程序 前言 前言 新建一个Flutter工程,选择Flutter Application 选择Flutter 同时配置Flutter sdk路径 n ...

  4. 如何把一个java程序打包成exe文件,运行在没有java虚

    如何把一个java程序打包成exe文件,运行在没有java虚 核心提示:首先,将编译好的程序打包成jar文件,然后做出exe,这样代码就不可见了:但是exe文件在没有安装jre的电脑上不能运行,如果要 ...

  5. Jenkins系列:5、wsl下的Jenkins编译Windows下的Qt程序并自动打包成exe

    Jenkins系列:5.wsl下的Jenkins编译Windows下的Qt程序并自动打包成exe 文章目录 Jenkins系列:5.wsl下的Jenkins编译Windows下的Qt程序并自动打包成e ...

  6. 教大家用按键精灵写一个快手自动抢红包脚本

    教大家用按键精灵写一个快手自动抢红包脚本 先设计好界面,为了节省大家的时间,界面方面我们早就设计好了,请看下面 设计好界面后就进入写代码的步骤,这个其实你可以先录制一遍,然后把录制的代码进行二次修改, ...

  7. 手写一个简易bundler打包工具带你了解Webpack原理

    用原生js手写一个简易的打包工具bundler

  8. 题目内容: 写一个将华氏温度转换成摄氏温度的程序,转换的公式是: °F = (9/5)*°C + 32 其中C表示摄氏温度,F表示华氏温度。 程序的输入是一个整数,表示华氏温度。输出对

    #题目内容: 写一个将华氏温度转换成摄氏温度的程序,转换的公式是: °F = (9/5)*°C + 32 其中C表示摄氏温度,F表示华氏温度. 程序的输入是一个整数,表示华氏温度.输出对应的摄氏温度, ...

  9. 怎么写一个文章自动生成器-免费的文章生成器下载

    怎么写一个文章自动生成器 写一个文章自动生成器需要具备一些特定的技术和编程能力,主要包括以下几个步骤: 数据收集:为了训练 AI 文章生成器,需要收集大量的文章数据,可以通过爬虫程序从互联网上收集数据 ...

最新文章

  1. 离线数据处理与流数据处理的区别
  2. 威马新车型,率先放话搭载L4自动驾驶
  3. 【做题记录】[NOI2008] 假面舞会—有向图上的环与最长链
  4. python生成和导入pyc文件
  5. C++高手总结的编程规律
  6. ubuntu1404_server搭建lamp
  7. 最大熵阈值python_第六章-逻辑斯蒂回归和最大熵模型
  8. BlackBerry 应用程序开发者指南 第一卷:基础--第8章 本地化应用程序
  9. elementui 日期选择值格式
  10. Atitit onvif协议获取rtsp地址播放java语言attilx总结
  11. 美萍美发管理系统服务器名称,美萍美发管理系统2017
  12. MATLAB图像拼接算法及实现(一)
  13. 利用线性回归进行销售预测
  14. 我能取得成就的原因和不足之处
  15. 【U盘刷机】小米路由器变砖如何100%刷机成功
  16. PHP网站从服务器下载文件到本地
  17. 电脑计算机软件硬盘不足,电脑提示磁盘空间不足怎么办
  18. 积木报表画布显示不了
  19. TreeView 四技
  20. Python @property 详解

热门文章

  1. Node.js:get/post请求、全局对象、工具模块
  2. 洛谷P2633 Count on a tree
  3. BZOJ 1370: [Baltic2003]Gang团伙 [并查集 拆点 | 种类并查集WA]
  4. ListView之SimpleAdapter的使用
  5. Web - 客户端存储的几种方式
  6. ACE库的LOGGING记录使用摘要(1)
  7. 多服务器session共享之memcache共享安装和实现篇(apache+php-windows)
  8. eclipse使用git合并_Eclipse中使用git
  9. 极客大挑战2020_五省同燃,千人开赛。2020年全国轮滑大联动暨MX名星轮滑伴我行城市轮滑挑战赛——扬州站、襄阳站、南宁站、潍坊站、沈阳站完美收官...
  10. Xamarin SQLite教程数据库访问与生成