網站首頁 編程語言 正文
前言
隨著項目的運營推廣,總少不了各種客戶定制化的需求,當前大部分軟件其實都離不開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 Setting
與Build 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的值。
總結
原文鏈接:https://juejin.cn/post/7105712170746249230
相關推薦
- 2022-11-11 C#中ArrayList?類的使用詳解_C#教程
- 2022-06-25 pycharm中venv文件夾自定義處理方式圖解_相關技巧
- 2022-07-23 解析go語言調用約定多返回值實現原理_Golang
- 2022-06-19 Rainbond云原生部署SpringCloud應用架構實踐_云其它
- 2023-01-21 Python中的二維列表使用及說明_python
- 2021-12-03 Apache?Log4j2?報核彈級漏洞快速修復方法_Linux
- 2022-04-21 C語言中const和指針的秘密你知道嗎_C 語言
- 2022-06-01 C語言?超詳細介紹與實現線性表中的帶頭雙向循環鏈表_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支