Flutter移動端進行多渠道打包發佈的全過程

前言

隨著項目的運營推廣,總少不瞭各種客戶定制化的需求,當前大部分軟件其實都離不開Saas的玩法;定制化需求雖然利潤高(特別是海外客戶),但對於開發人員來說卻比較難搞,同一套代碼需要支持不同的需求。

一般我們處理這種需求的時候會引入渠道包的概念,每個客戶擁有獨立渠道,通過渠道指定不同的資源、賦予不同的功能,從而編譯出定制化的版本。本篇文章將分享Flutter中如何進行移動端(iOS、Android)的渠道編譯,替換應用圖標、名稱、appkey等。

Android端

1、配置build.grade

Android端的打包配置,主要是通過build.grade文件進行配置,在android目錄下加入flavorDimensions,然後配置不同的風味維度;

android {
    // ......
    flavorDimensions 'channel'
    productFlavors {
        develop {
            applicationId "${defaultConfig.applicationId}"
        }
        customer {
            applicationId "${defaultConfig.applicationId}" // 可替換成客戶的AppID
        }
        productFlavors.all {
            // 遍歷productFlavors多渠道,設置渠道名稱,在flutter層也能取到
            flavor -> flavor.manifestPlaceholders.put("CHANNEL", name)
        }
    }
}

之後我們為每個渠道設置資源的名稱,每個渠道有不同的資源,避免不相關的資源打包進去,增加包大小。

productFlavors {
// 省略,見上
}
// 為不同渠道指定不同資源文件配置
sourceSets {
    main.java.srcDirs += 'src/main/kotlin'
    // develop無指定就默認使用src/main/res
    squatz.res.srcDirs 'src/main/res-customer'
}

2、配置mainfest

Mainfest在<application>下擴展一個元數據,字段名取build.grade中的風味秒速channel,字段值則是put出去的CHANNEL。其他的都不需要改變,因為mainfest所引用到的資源名稱我們都沒有改變。

<application>
    <!-- 多渠道打包 -->
    <meta-data
        android:name="channel"
        android:value="${CHANNEL}" />
</application>

3、新增對應資源

由於Mainfest的變量名沒有變過,因此新增資源的名稱就需要跟res中的保持一致。

4、打包編譯

flutter build apk --flavor Customer --obfuscate --split-per-abi

打包命令非常簡單,指定flavor為build.grade中配置的渠道名稱即可,註意首字母大寫!

iOS端

筆者並無iOS的實際開發經驗,對iOS並不熟悉;但網上對這塊的記錄真的是少之又少,所以還是決定記錄下來,接下來的內容雖成功實踐過,但未必是最佳方法,歡迎大傢一起交流。

1、分發Target

Target其實是貫穿iOS整個開發過程的,無論是運行目標還是UI控制器,都離不開target;Target是工程編譯的目標,其會繼承Project的編譯設置,並可重新設置自己的編譯配置,比如Build SettingBuild Phases

  • 新建Target,直接在原target右鍵分發一個出來,默認會復制原target的所有配置。

  • 修改應用信息,註意圖標、應用名稱等資源另起一個文件夾去配置。

  • 打包

自此iOS就有瞭多個打包目標,非常簡單。這也是iOS體系開發比較好的一點,沒有太多花裡胡哨的玩法,跟著文檔配置就好瞭。
flutter打包命令:flutter build ipa --flavor Customer --release

  • 遇到問題

目前我們遇到如下問題,配置好後在flutter層執行flutter build ios –flavor Customer –release後,會導致xcode重新build項目,然後pod_Runner的動態依賴丟失,但是在xcode中執行又不會。

Flutter端區分渠道

在打包的時候我們可以使用參數-dart-define=CHANNEL=XXXX,其中CHANNEL是參數key,xxxx是name,然後在flutter中使用String.fromEnvironment('CHANNEL', defaultValue: 'develop');,即可獲取到key為CHANNEL的值。

總結

到此這篇關於Flutter移動端進行多渠道打包發佈的文章就介紹到這瞭,更多相關Flutter多渠道打包發佈內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: