1. 程式人生 > >cordova熱更新外掛cordova-hot-code-push學習

cordova熱更新外掛cordova-hot-code-push學習

準備工作:安裝cordova hot code push客戶端工具

npm install -g cordova-hot-code-push-cli

一、本地熱更新開發

1、建立一個新的測試demo工程並進入該專案

2、新增熱更新外掛:cordova plugin add cordova-hot-code-push-plugin

3、新增本地除錯外掛:cordova plugin add cordova-hot-code-push-local-dev-addon

4、啟動熱更新服務:cordova-hcp server,要先開啟另一個命令視窗進入此專案根目錄然後執行

5,檢查專案根目錄下面的config.xml檔案下資訊,是否有如下資訊

    <chcp>         <config-file url="https://8ca0caa8.ngrok.io/chcp.json" />         <local-development enabled="true" />     </chcp>

沒有則需要手動新增,確保config-file的url屬性值是執行熱更新服務端的地址

6,修改www中的檔案,比如修改主頁中的文字,修改儲存之後,在啟動服務的終端中應該可以看見log,真機中的效果會發生改變,這是因為程式碼實時的改變了

二:搭建遠端伺服器熱更新環境

1,搭建一個遠端服務平臺,可以用Tomcat或Nginx伺服器,在伺服器中能訪問的位置裡放一個www資料夾,到時候將專案中執行後的www檔案放到這裡來即可

2、在開發端建立一個cordova工程,新增平臺

3、新增熱更新外掛:cordova plugin add cordova-hot-code-push-plugin

4、在專案根目錄下的config.xml檔案中新增一下內容: <chcp>         <auto-download enabled="false" /> // 是否自動下載更新         <auto-install enabled="false" /> // 是否自動安裝更新         <config-file url="http://x.x.x.x:8888/xxx/chcp.json"/>

// app在檢查更新(有自動檢查更新和手動檢查更新,我這裡使用的是手動檢查更新,能夠自己控制會更好一點)的時候,會將app中www資料夾下的chcp.json與伺服器中content_url訪問的目錄下的chcp.json比較,好像是當兩個release時間不相等(不會比較大小)的時候,就會更新。 </chcp>

客戶端app的www檔案下的chcp.json檔案

{   "autogenerated": true, // 自動編譯,相等於檔案修改之後,自動執行cordova-hcp build命令。編譯完之後,會在chcp.manifest檔案中生成www資料夾中每個檔案的hash碼   "release": "2017.11.09-14.14.49", // 用來和服務端的chcp.json檔案的release時間做比較,不相同就會觸發更新   "content_url": "https://4b007e7f.ngrok.io", // 服務端地址   "update": "now" // 更新時間 }

chcp.minifest檔案:

{     "file": ".idea/inspectionProfiles/Project_Default.xml",     "hash": "ca39aae2553e263f6545d7364a7aa0d4" }

由此種物件組成的陣列,熱更新外掛會比對app本地和伺服器上的同一個檔案的hash碼判斷是否需要更新

4、在專案的根目錄下新增一個檔案,檔名為cordova-hcp.json(該檔案與config.xml檔案目錄位置同級),檔案內容: {   "update": "start",   "content_url": "http://x.x.x.x:8888/xxx" } 以後每次cordova-hcp build的時候,都會以cordova-hcp.json檔案為模板,比如現在新增完這個檔案之後,執行cordova-hcp build,chcp.json的檔案的內容就回變成: {   "update": "start",   "content_url": "http://x.x.x.x:8888/xxx",   "release": "2017.11.09-15.01.03" }

5、app中呼叫程式碼手動更新,此處用的是vuxUI元件:

chcp.fetchUpdate(function (fetchError, data) {
  if (!fetchError) {
    _this.$vux.confirm.show({
      // 元件除show外的屬性
      title: '更新提示',
      content: '更新已經下載完畢,確認安裝更新?',
      confirmText: '確定',
      cancelText: '取消',
      onCancel () {
        console.log("取消安裝更新...");
      },
      onConfirm () {
        chcp.installUpdate(function (installError) {
          if (installError != null) {
            _this.$vux.alert.show({
              title: '提示',
              content: '安裝更新失敗...'+JSON.stringify(installError)
            })
          } else {
            _this.$vux.alert.show({
              title: '提示',
              content: '安裝更新完成...'
            })
          }
        });
      }
    })
  } else { // shi bai
    _this.$vux.alert.show({
      title: '提示',
      content: '下載更新失敗...'+JSON.stringify(fetchError)
    })
  }
});

7,在vue + cordova中的執行順序: 1, npm run build 2, cordova-hcp build 3, cordova build android 

8,將打好包的app裝到真機中,將專案的www檔案替換伺服器的www檔案

9,  改變app內的檔案,重新npm run build然後cordova-hcp build,最後將專案的www檔案替換伺服器的www檔案,主動觸發更新事件,就可以熱更新了