混合开发
新建Flutter
工程flutter_module
,工程类型Flutter Module
新建iOS
工程NativeDemo
跟flutter_module
工程放入同一目录,使其与flutter_module
工程进行关联,能够打开flutter页面
- 创建
Podfile
文件以及配置
$ cd /Users/wn/Desktop/NativeDemo
$ pod init
<!-- Podfile文件 -->
flutter_application_path = '../flutter_module'
load File.join(flutter_application_path,'.iOS','Flutter','podhelper.rb')
platform :ios, '9.0'
target 'NativeDemo' do
install_all_flutter_pods(flutter_application_path)
use_frameworks!
end
$ pod install
- 查看
NativeDemo
工程与flutter_module
相关依赖是否引入
- 添加
跳转Flutter页面代码
运行NativeDemo
如果当前~/flutter
环境不能使用,这个时候NativeDemo
就打不开flutter页面
,如果我们想跳转flutter页面
,就需要构建混合工程打包成framework
使用。
// ~/flutter环境出错,运行NativeDemo提示错误
Command PhaseScriptExecution failed with a nonzero exit code
Flutter混合工程构建
下面把flutter_module
打包成framework
提供给NativeDemo
工程使用
- 构建混合工程
// 构建混合工程
$ cd /Users/wn/Desktop/flutter_module
$ flutter build ios-framework --output=../flutter_app
flutter包
发布会有三个版本Debug
、Release
、Profile
;其中Release
发布版本的性能最高,因为发布版本会把调试信息
等去掉,所以Debug
调试版本的包并不能体现出其性能
;而Profile
版本的包同时具备调试功能
与发布版本
的性能;一般在发布之前会使用Profile
版本进行调试。
- 这里我们先把
Debug
版本的framework
导入NativeDemo
工程使用
其中Flutter.xcframework
与flutter环境
相关,原生工程只要有了Flutter.xcframework
就具备了flutter环境
,其实就是有了flutter的api
;如果想要显示flutter_module
工程的内容,就需要使用App.xcframework
。
- 运行
NativeDemo
工程
这个时候即便~/flutter
环境出现问题,NativeDemo
混合工程依然能够运行;只是嵌入了flutter渲染引擎
会导致NativeDemo.app
体积变大。
// ~/flutter环境出现问题
$ flutter doctor
-bash: /Users/wn/Documents/flutter/bin/flutter: No such file or directory
Cocoapods
上面我们通过framework
构建了混合工程,接下来我们通过Cocoapods
来构建混合工程。
- 构建混合工程
// 构建混合工程
$ cd /Users/wn/Desktop/flutter_module
$ flutter build ios-framework --cocoapods --output=../flutter_app
使用Cocoapods
构建混合工程,Flutter引擎环境
在Debug
目录下变成了Flutter.podspec
,与framework
不同的是引擎环境
需要自己下载。
- 把
Debug
版本的framework
放入NativeDemo
工程目录下
$ pod init
<!-- Podfile文件 -->
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
target 'NativeDemo' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
pod 'Flutter',:podspec => 'Debug/Flutter.podspec'
# Pods for NativeDemo
end
$ pod install
- 导入
App.xcframework
库
成功运行NativeDemo
工程。
问题:如果flutter_module
工程代码发生变化,就需要重新打包App.xcframework
,这样就很繁琐,下面我们配置脚本使用混合工程自动化
。
混合工程自动化
- 使用
Github
创建一个代码仓库
- 配置
免密登陆
,生成access token
并配置成环境变量
进行免密登陆
- 进入
混合工程自动化
目录,把flutter_module
与NativeDemo
工程整个作为仓库
- 把
flutter_module
与NativeDemo
工程提交到服务器
$ git add .
$ git commit -m '添加工程'
$ git push
- 把
module
打包成framework
并放入仓库目录,也就是把打包过程交给仓库来做
Github
中点击Actions
配置CI
<!-- CI脚本内容,每次提交代码就会重新打包framework -->
name: FlutterCI #CI名称
on: [push] #触发条件push操作!
jobs:
check:
name: Test on ${{ matrix.os }}
#运行在哪个平台这里是MacOS平台
runs-on: macos-latest
steps:
- uses: actions/checkout@v1
#三方flutter的Action,它可以在服务器配置一个Flutter环境
- uses: subosito/flutter-action@v1
with:
flutter-version: '2.5.3'
channel: 'stable'
#想让我们CI做的事情!
- run: cd flutter_module && flutter build ios-framework --cocoapods --output=../NativeDemo/Flutter
- run: |
git add .
git commit -m 'update flutter framework'
- name: Push changes
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
- 执行
脚本文件
,Flutter
目录下成功打包framework
文件
- 拉取代码
$ git pull
- 配置
Podfile
文件,并执行pod命令
$ pod init
<!-- Podfile文件 -->
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
target 'NativeDemo' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
pod 'Flutter',:podspec => '/Flutter/Debug/Flutter.podspec'
# Pods for NativeDemo
end
$ pod install
- 导入
App.xcframework
库,成功运行NativeDemo
工程(同上面Cocoapods过程)