Flutter多渠道多资源配置终极解决方案,看这篇就够了

目前已经使用本方案成功上架了goole playapp 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图标

image.png

使用Android studio打开android目录,使用自带的图标生成工具生成,选中 res-channelA的文件夹右键 new -> Image Asset,选中对应渠道即可自动生成

image.png

配置启动图,如果遇到背景图不显示,删除渠道下的mipmap-anydpi-v26即可

image.png

配置App名称App图标
每个渠道创建strings.xml文件,输入想要的App名称

image.png

以上配置在ChnnelB渠道下也需要同样配置,文件名需要一致,可以在channelA拷贝过去后进行修改

最后配置AndroidManifest.xml清单文件即可。

image.png

此外还有依赖库分渠道依赖,主要用来区分第三方依赖库。比如海外不需要推送sdk等需求
使用channelAImplementation到指定某依赖库只在某渠道下导入。Implementation前是渠道名。

image.png

至此Android多渠道多资源配置已经完成。

接下来需要进行debug运行配置

image.png image.png 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

image.png

此时会生成Runner copy-Info.plist文件,为方便管理,建议重新命名
修改target的plist文件 image.png

配置图标,启动图,启动页面等资源,为了方便管理,十分建议按这种方式去存放资源文件
新建文件夹channelA

image.png

image.png

在创建的Assets-ChannelALaunch Screen-ChannelA 文件中自定义该渠道的App图标和启动页

image.png

image.png

Target与所创建的资源关联。
点击General,填写该Target的相关信息,点击Build Phases 选择对应资源文件

image.png

image.png

image.png

channelB同理

添加scheme,为了我们能直接运行对应的Target

image.png

image.png

添加build scheme 选择Runner info 依次为渠道分发三个环境

image.png

image.png

至此,ios多渠道多资源配置完毕。 选择对应的channel运行试一下

image.png

ios打包
flutter build ios --release切换至release环境。避免上传TestFlight失败
flutter build ipa --flavor channelA 即可.
等等,打包出来的ios包运行闪退? 无法运行?

你以为这就结束了吗? 不,感受flutter的多渠道的缺陷吧

当我们项目里使用到一些ios的第三方库时,我们能在Build phases 里看到应用的依赖库

image.png 当我们配置channel时直接从Runner分发一个target出来。此时该targetBuild Phases下的依赖库和资源是与主项目一样的。因此我们可以直接通过XCode运行,只需要修改Copy Bundle Resources下引用的App图标和启动图。
但当我们使用flutter build ios --release时 该指令会将我们target 下所有依赖库全部清空。此时是无法直接运行的,这也是为什么flutter 打包出来的ios包运行会闪退的原因。看图 flutter build iosflutter build ipa都会使target的依赖库丢失。

image.png

image.png

缺乏依赖库,运行报错。

image.png

解决方案

1、根据上面步骤配置好ios渠道与资源, 需检查Build Phases与主项目里的依赖库一致。 先别flutter build ios --release,拷贝一份配置文件路径:项目根目录/ios/Runner.xcodeproj在其他目录下。

2、运行flutter build ios --release,成功切换release环境后把上面准备好的配置文件重新覆盖回来。即可运行

image.png

image.png

3、关于打包,flutter层面的统计渠道参数,只能先在代码写死。(方法很蠢 - -,但是实用,后面可以用脚本来处理)。通过XCode来打包

image.png

image.png

image.png

image.png

image.png

目前为止,已经成功上架过几个项目到google playapp store

后期扩展,使用shell脚本+Jenkins打包。下次再说吧

猜你喜欢

转载自juejin.im/post/7115334513206493215