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檔案,主動觸發更新事件,就可以熱更新了