熱更新部署方案
前言
目前採用的熱更新方案是微軟提供的( cordova-plugin-code-push ),大平臺,穩定性等方面更可靠。
本文也主要是通過以下方面進行介紹:
- mac環境搭建
- 熱更新伺服器連線
- 常用命令介紹
- app環境部署
- 部分用法介紹
一、環境部署及實現
1、mac端環境準備
全域性安裝code-push-cli
npm install -g code-push-cli
注: code-push-cli 是連線熱更新服務端的工具,我們把要更新的程式碼上傳至服務端,客戶端(我們的app)安裝 cordova-plugin-code-push 外掛來從服務端下載程式碼.
2、登入熱更新服務端
主要流程:
2.1、命令列登入code-push伺服器
code-push login //擴充套件 //登出登入 code-push loout
該命令會開啟瀏覽器視窗讓我們登入code-push服務端
2.2、登入成功後會獲取授權token
此處用github登入,成功後會返回一個授權token,複製此token
2.3、終端輸入授權token
token作用是將來與服務端做校驗,將獲取到的token複製到命令列,回車則登入成功, 至此,code-push服務端算是登入成功了。
//擴充套件 //列出登入的token code-push access-key ls //刪除某個token code-push access-key rm <accessKey>
3、code-push 命令介紹
此處先介紹api,伴隨api強調注意事項:
3.1、給app在熱更新服務端建立應用
code-push app add <appName> <os> <platform>
eg> code-push app add test-ios ios cordova
- <appName> : 應用在服務端名稱(建議以app名稱加" android"或" ios"字尾,以防忘記)
- <os> : 應用所屬系統 (ios \ android),全小寫
- <platform> : 平臺名稱 ,此處都為 cordova
注意事項:
注意的是服務端在建立應用的時候會預設為每個應用生成兩種部署型別("Production"和"Staging"),這兩種型別分別代表生產環境和開發環境,一定要記下該過程中生成的這四個key值,key是用來連線客戶端和服務端的,此處以Staging舉例:

Staging案例
3.2、刪除應用
code-push app rm <appName>
3.3、檢視熱更新服務端上建立的應用
code-push app list
3.4、釋出應用
code-push release-cordova <appName> <platform> [options]
Options引數(常用的幾個):
- --deploymentName(或“-d”),指定部署型別,預設“Staging”,可以選擇“Production”或其他;
- --label(-l),指定標籤版本更新,預設最新
- --description(或“--des”),新增描述;
- --mandatory(或“-m”),指定是否需要強制更新;
- --targetBinaryVersion(或“-t”),指定推送版本號
- --rollout(-r):只支援一定比例的使用者安裝更新
- --disabled( -x):將釋出更新標記為禁用,這樣更新能正常釋出,但使用者用不了
案例說明:
// 1、釋出更新 code-push release-cordova test-ios ios --des "描述" // 2、部署“Production”更新 code-push release-cordova test-ios ios -d "Production" --des"描述資訊" // 3、新增強制更新 code-push release-cordova test-ios ios -m // 4、指定版本推送 code-push release-cordova test-ios ios --targetBinaryVersion "~1.0.0"
範圍規則
1.2.3 僅僅只有1.2.3的版本 *所有版本 1.2.x 主要版本1,次要版本2的任何修補程式版本 1.2.3 - 1.2.7 1.2.3版本到1.2.7版本 >=1.2.3 <1.2.7 大於等於1.2.3版本小於1.2.7的版本 ~1.2.3 大於等於1.2.3版本小於1.3.0的版本 ^1.2.3 大於等於1.2.3版本小於2.0.0的版本
注意事項:
- 一般生產環境的包是壓縮過的,所以在釋出正式熱更新環境之前,先執行“cordova build --prod”壓縮程式碼;
- 用“-m”設定為強制更新後,code-push外掛從服務端下載完程式碼,會立即重啟app
- 每次app釋出新應用到商店的時候都應該同時往code-push伺服器推送一個初始版本(後續每次提交版本,都會與初始版本比較並生成補丁包)
3.5、檢視部署狀態
code-push deployment list <appName>
eg:
// 檢視test-ios部署狀態 code-push deployment list test-ios //檢視test-ios部署狀態及key值(忘記key值可以這樣找) code-push deployment list test-ios -k
3.6、清空部署紀錄
code-push deployment clear <appName> <deploymentName>
eg:
// 清空test-ios 在Staging狀態下的部署紀錄 code-push deployment clear test-ios Staging
3.7、新增部署狀態
預設只有“Staging”和“Production”兩種狀態
code-push deployment add <appName> <deploymentName>
//eg> code-push deployment add test-ios Staging
3.8、刪除自定義部署狀態
code-push deployment rm <appName> <deploymentName>
3.9、檢視歷史版本
code-push deployment history <appName> <deploymentName> 檢視歷史版本
3.10、重新命名一個部署
code-push deployment rename <appName> <currentDeploymentName> <newDeploymentName>
3.11、重新命名一個已存在app
code-push app rename 重新命名一個存在 app
3.12、把app所有權轉移到另一賬號
code-push app transfer
3.13、修改更新
code-push patch <appName> <deploymentName> <options>
3.14、升級環境
code-push promote <appName> <sourceDeploymentName> <destDeploymentName> <Options> //eg: //"MyApp"中"Staging"部署的最新更新發布到"Production"部署中 code-push promote MyApp Staging Production
3.15、回滾更新
//指定迴歸到哪個標籤,預設回滾到上一個 //--targetRelease (-r) // 不能跨版本回滾 code-push rollback <appName> <deploymentName> [--targetRelease <releaseLabel>]
4、app環境準備
4.1、進入app目錄,安裝熱更新外掛及外掛依賴
cd "app目錄" cordova plugin add cordova-plugin-code-push
4.2、檢視是否安裝白名單外掛,沒有則安裝
// 檢視命令 cordova plugin list // 安裝命令 cordova plugin add cordova-plugin-whitelist
4.3、配置config.xml環境程式碼
新增如下配置以允許code-push伺服器通訊
<access origin="*"/> 或者 <access origin="https://codepush.azurewebsites.net" /> <access origin="https://codepush.blob.core.windows.net" /> <access origin="https://codepushupdates.azureedge.net" />
4.4、配置熱更新key
在config.xml中新增deployment key,key和平臺是一一對應的
<platform name="android"> <preference name="CodePushDeploymentKey" value="YOUR-ANDROID-DEPLOYMENT-KEY" /> </platform> <platform name="ios"> <preference name="CodePushDeploymentKey" value="YOUR-IOS-DEPLOYMENT-KEY" /> </platform>
4.5、配置index.html
在index.html中新增如下程式碼
<meta http-equiv="Content-Security-Policy" content="default-src https://codepush.azurewebsites.net 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *" />
目的也是為了允許code-push伺服器通訊
5、code-push api介紹
5.1、詢問code-push服務端是否有更新
codePush.checkForUpdate(onSuccess, onError?, deploymentKey?: String);
eg:
codePush.checkForUpdate(function (update) { if (!update) { console.log("The app is up to date."); } else { console.log("An update is available! Should we download it?"); } });
6、用法
6.1、在app deviceready時直接使用
//一般直接用這個,每次ready後自動獲取 codePush.sync();
6.2、如果希望app能夠儘快的獲取更新資訊,則
//這個是每次從後臺喚醒都會檢查更新 document.addEventListener("resume", function () { codePush.sync(); });
6.3、常用三種更新方案
如果有釋出熱更新時 mandatory 則 Code Push 會根據 mandatory 是 true 或false 來控制應用是否強制更新。預設情況下 mandatory 為 false 即不強制更新。mandatory 為 false時以下三種設定方法才有效 // 第一種: codePush.sync(); // 第二種: codePush.sync({ updateDialog: false, installMode: codePush.InstallMode.IMMEDIATE }); // 第三種: CodePush.sync({ deploymentKey: 'deployment-key-here', updateDialog: { optionalIgnoreButtonLabel: '稍後', optionalInstallButtonLabel: '後臺更新', optionalUpdateMessage: '有新版本了,是否更新?', title: '更新提示' }, installMode: CodePush.InstallMode.IMMEDIATE }); 三種更新的策略: 配置到installMode: 之後即可生效 * IMMEDIATE 立即更新APP * ON_NEXT_RESTART 到下一次啟動應用時 * ON_NEXT_RESUME 當應用從後臺返回時
二、注意事項
- 1、app內版本號如果為1.0.0,則熱更新打包上傳的版本也必須為1.0.0,需要和app保持一致,伺服器會根據你最新上傳的且版本號和app一致的版本作為最新版本
- 2、真正整合過程中還需要考慮更新回滾問題,活著指定版本釋出,這個需要結合上面api合理搭配處理;