目前已经使用本方案成功上架了goole play
和app store
,流程较长,后面可以配合脚本使用。脚本的编写不在本篇文章展开,以机械式实操为主。
1、Flutter内渠道配置
Flutter中的渠道配置一般用于埋点统计
使用--dart-define
进行渠道区分
打包时指令 flutter build apk --dart-define=CHANNEL=channelA
代码里获取渠道
String _channelName = const String.fromEnvironment('CHANNEL', defaultValue: 'develop');
2、多资源配置
Android
在项目根目录/android/app/build.gradle
下进行渠道配置
...
android{
...
// 配置渠道对应appid,还支持配置其他渠道参数
productFlavors {
channelA{
applicationId "com.example.channelA"
}
channelB{
applicationId "com.example.channelB"
}
}
...
//配置渠道对应的安卓资源目录
sourceSets {
channelA.res.srcDirs 'src/main/res-channelA'
channelB.res.srcDirs 'src/main/res-channelB'
}
...
}
...
productFlavors
还有buildConfigField
manifestPlaceholders
signingConfig
等等配置,主要用于区分第三方SDK,配置渠道配置参数,渠道包签名等功能,这里不展开~
在项目根目录/android/app/main/
目录下配置启动页,图片,App名称等资源
配置App图标
使用Android studio
打开android
目录,使用自带的图标生成工具生成,选中 res-channelA
的文件夹右键 new -> Image Asset
,选中对应渠道即可自动生成
配置启动图,如果遇到背景图不显示,删除渠道下的mipmap-anydpi-v26
即可
配置App名称
和App图标
每个渠道创建strings.xml
文件,输入想要的App名称
以上配置在ChnnelB
渠道下也需要同样配置,文件名需要一致,可以在channelA
拷贝过去后进行修改
最后配置AndroidManifest.xml
清单文件即可。
此外还有依赖库分渠道依赖,主要用来区分第三方依赖库。比如海外不需要推送sdk
等需求
使用channelAImplementation
到指定某依赖库只在某渠道下导入。Implementation
前是渠道名。
至此Android多渠道多资源配置
已经完成。
接下来需要进行debug运行配置
channelB
同理。配置完成后选择对应的channelA
点击运行即可。
打包指令
apk
flutter build apk --flavor channelA --dart-define=CHANNEL=channelA
flutter build apk --flavor channelB --dart-define=CHANNEL=channelB
aab
flutter build appbundle --flavor channelA --dart-define=CHANNEL=channelA
flutter build appbundle --flavor channelB --dart-define=CHANNEL=channelB
IOS
由于Flutter build指令与ios target的冲突,每次运行Flutter build ios
都会使得ios项目target资源被清除。因此配置过程比较艰辛。但实测按照以下步骤应该是没有问题的。
安装XCode
环境,懂得都懂~
使用XCode
打开ios
项目,确保项目能够正常运行。
分发target
,选中Runner
,在右侧的TARGETS
右键选中Duplicate
此时会生成Runner copy-Info.plist
文件,为方便管理,建议重新命名
修改target的plist文件
配置图标,启动图,启动页面等资源,为了方便管理,十分建议按这种方式去存放资源文件
新建文件夹channelA
在创建的Assets-ChannelA
和Launch Screen-ChannelA
文件中自定义该渠道的App图标
和启动页
将Target
与所创建的资源关联。
点击General
,填写该Target
的相关信息,点击Build Phases
选择对应资源文件
channelB
同理
添加scheme
,为了我们能直接运行对应的Target
添加build scheme
选择Runner
info
依次为渠道分发三个环境
至此,ios
多渠道多资源配置完毕。 选择对应的channel运行试一下
ios打包
flutter build ios --release
切换至release
环境。避免上传TestFlight
失败
flutter build ipa --flavor channelA
即可.
等等,打包出来的ios包运行闪退? 无法运行?
你以为这就结束了吗? 不,感受flutter的多渠道的缺陷吧
当我们项目里使用到一些ios的第三方库
时,我们能在Build phases
里看到应用的依赖库
当我们配置
channel
时直接从Runner
分发一个target
出来。此时该target
在Build Phases
下的依赖库和资源是与主项目一样的。因此我们可以直接通过XCode
运行,只需要修改Copy Bundle Resources
下引用的App图标和启动图。
但当我们使用flutter build ios --release时
该指令会将我们target
下所有依赖库全部清空。此时是无法直接运行的,这也是为什么flutter 打包出来的ios包运行会闪退的原因。看图 flutter build ios
和 flutter build ipa
都会使target
的依赖库丢失。
缺乏依赖库,运行报错。
解决方案
1、根据上面步骤配置好ios
渠道与资源, 需检查Build Phases
与主项目里的依赖库一致。 先别flutter build ios --release
,拷贝一份配置文件路径:项目根目录/ios/Runner.xcodeproj
在其他目录下。
2、运行flutter build ios --release
,成功切换release
环境后把上面准备好的配置文件重新覆盖回来。即可运行
3、关于打包,flutter
层面的统计渠道参数,只能先在代码写死。(方法很蠢 - -,但是实用,后面可以用脚本来处理)。通过XCode来打包
目前为止,已经成功上架过几个项目到google play
和app store
。
后期扩展,使用shell脚本+Jenkins打包。下次再说吧