Flutter组件化导入至iOS现有工程中(CocoaPods篇)

Flutter项目实战:方案有三

  • 纯Flutter项目,需要投入大量人力进入到Flutter编程中,且现有原生项目需要完全摒弃
  • Flutter项目混编,暂且不说Flutter所支持的框架,与原生交互的坑也暂时还没有填完,且Flutter一旦更新,需要手动进行更新后重新放入原生项目,对现有原生操作较多,代价较大
  • Flutter项目组件化,iOS通过cocoapods引入,安卓通过aar包引入,对现有原生项目影响不大

也就可以看出最简单的方法就是将Flutter项目进行相对应打包,产生产物分别对应iOS和安卓进行组件化生成,也就完成了Flutter现有项目的开发,同时也不会对现有原生项目产生较大影响的方法是最为可行的。

现新创建一个Flutter项目
新建一个文件夹,用于放置Flutter项目,进入后,运行

flutter create -t module my_flutter

完成后会在文件夹中生成一个my_flutter文件,进入my_flutter文件中,运行

flutter packages get

继续运行

flutter run

如果此时可以显示界面,说明创建Flutter没有问题,这里不做过多赘述,详细可以看 Flutter官网

iOS打包产物

通过以上命令,生成了对应的Flutter项目文件后,我们本需要通过build命令来一步步生成iOS产物,这里通过一个我写的shell脚本来做这些步骤

#前提flutter一定要是app项目: pubspec.yaml里 不要加
#module:
#  androidPackage: com.example.myflutter
#  iosBundleIdentifier: com.example.myFlutter

echo "Clean old build"
find . -d -name "build" | xargs rm -rf
flutter clean

echo "开始获取 packages 插件资源"
flutter packages get

echo "开始构建 release for ios"
flutter build ios 
echo "构建 release 已完成"
echo "开始 处理framework和资源文件"

rm -rf build_for_ios
mkdir build_for_ios

cp -r build/ios/Release-iphoneos/*/*.framework build_for_ios
cp -r .ios/Flutter/App.framework build_for_ios
cp -r .ios/Flutter/engine/Flutter.framework build_for_ios
cp -r .ios/Flutter/FlutterPluginRegistrant/Classes/GeneratedPluginRegistrant.* build_for_ios


#下一步处理 如何自动生成podspec
#下下一步处理 如何自动发布pod

这里声明一下,Flutter在1.2.1版本之后,把flutter_assets文件放入到了App.Framework中,所以这里无需进行相关操作,执行上述脚本,会在同级目录下获得一个文件夹

文件夹包含三个产物,即Flutter.framework,App.Framework以及GeneratedPluginRegistrant类文件(用于调用注册Flutter引擎)
生成这几个产物后,iOS的Flutter编译暂时到此为止。

iOS cocoapods私有库制作

一、远程私有索引仓库

1、在github上面创建一个仓库,用来存放索引文件。以后使用CocoaPods查找私有组件也是从这里获取。创建后在本地新建一个文件夹,使用git命令进行相关git的init等操作,不做赘述
2、本地链接远程索引仓库

  • 查看本地仓库
pod repo
  • 添加远程索引仓库
pod repo add 仓库名 仓库SSH(HTTPS)地址
  • 验证是否添加成功
pod repo

二、创建一个自定义组件远程代码仓库

1、创建一个文件夹,用来保存要制作的组件代码仓库
2、创建pod的一个git本地仓库,终端cd至该文件夹下
3、创建代码仓库
pod lib create 仓库名

会进行几个问题的回答,创建成功后,会自动弹出项目


此时再回到之前flutter打包iOS运行脚本后生成的build_for_ios文件夹,开始将产物加入

注意,该步骤关系到pod能否成功install且项目能否运行!!!

将产物的GeneratedPluginRegistrant类文件放到Classes文件夹内,同时在Classes文件夹同级手动创建一个Frameworks文件夹,将App.framework和Flutter.framework框架放入,然后


打开podspec文件


配置如图所示,根据自己的仓库地址进行相关配置,然后cd到刚才生成的pod的demo文件夹中,即Example文件夹


运行

pod install

后会生成如上图所示,这些文件都放入成功,那么到这一步,Flutter生成的产物就成功导入你的私有库中了,接下来就是pods库的操作

回到放置podspec文件所在目录,关联上你的远程代码仓库,然后进行

git add .
git commit -m '上传代码'
git push

将代码上传后,标记tag

git tag 0.1.0
git push --tags

注意这里的tag要和你的podspec文件中的版本version要一致,podspec离得s.name要和你的文件夹的名字保持一致,否则pod会验证失败

运行

pod spec lint

验证成功后如上图所示,我这里使用的是另一个pod私有库,其他验证出来的问题自行百度,这里不做赘述

验证成功后,即可上传到私有库

pod repo push <索引库名> 

注:如果有警告上传报错可以用下面的方法

pod repo push <索引库名>  --allow-warnings

到了这一步,如果上传成功,会显示

到此cocoapods私有库创建上传完成。

三、创建一个demo工程(即现有的原生工程)

在podfile文件中添加

# 远程私有索引地址(这里就是之前所创建的索引仓库所在的地址)
source 'https://...'
# 公共库索引
source 'https://...'

一定要添加公共库索引,即https://github.com/CocoaPods/Specs.git,因为项目中其他的三方库是通过cocoapods查找,如果不添加,cocoapods通过私有库是找不到你的其他的库的,然后

pod install

完成后,调用flutter界面,即可看到你的flutter编写的界面

Have done!

注意:

1、flutter更新1.9版本之后,由于会对Flutter.Framework进行签名,无法编译成功,需要将sdk版本切换为master分支版本,编译成功后,新版本的flutter clean命令会将.ios文件删除,所以脚本中打包时候,flutter clean命令需要去除
2、如果你的工程添加了flutter_boost组件,当前最新版本是1.5.4,如果你升级了flutter,那么就先退回去吧,flutter_boost暂不支持1.8以上的flutter版本,否则无法编译通过
3、由于本人之前未更新flutter1.7.8版本,用的是1.5.4版本,所以此次本人回退至1.7.8版本也着实踩了不少的坑,flutter的release build ios会自动生成armv7,需要去除,否则引入了flutter_boost的同学会打不出release包的

你可能感兴趣的:(Flutter组件化导入至iOS现有工程中(CocoaPods篇))