開發工具HbuilderX
開發框架 uni-app、h5+
1、生成 App 資源升級包
1.1、修改版本號
1.2、首先,更新 manifest.json 中的版本號。
比如之前是 1.0.0,那麼新版本應該是 1.0.1 或 1.1.0 這樣。
2、發行
2.1、然後,在 HBuilderX 中生成升級包(wgt)。
2.2、選單->發行->原生App-製作移動App資源升級包
2.3、生成結束會在控制檯告知升級包的輸出位置。
3.安裝資源升級包
3.1、應用的升級需要服務端與客戶端配合完成,下面以本地測試過程中的操作舉例說明:
3.2、生成的 wgt 檔案給後端人員,放在伺服器目錄下,生成下載連結,返回給開發app開發者
4、服務端介面
4.1、與後端約定檢測升級的介面 ,介面地址 'Home/getShopAppVersion’
5、客戶端檢測升級
5.1、在 App.vue 的 onLaunch 中檢測升級(也可以在首頁中,首頁中請使用onLoad),程式碼如下
// 熱更新 wgtUpload:function(){ const that=this; //plus.runtime.getProperty(),獲取本機安裝的版本,具體使用請參照如下連結 //https://www.html5plus.org/doc/zh_cn/runtime.html#plus.runtime.WidgetInfo plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) { //'Home/getShopAppVersion' 獲取服務端的版本 that.$http.post('Home/getShopAppVersion',{},{'load':false}).then(function(response){ // 獲取服務端版本轉化為陣列 var onlineAndroidVersion=response.data.android.split("."); // 獲取本機安裝版本轉化為陣列 var localAndroidVersion=that.$Androidversion.split("."); // 是否更新 var isUpload=false; for(var i=0;i<onlineAndroidVersion.length;i++){ // 服務端版本是否大於本地版本 if(parseInt(onlineAndroidVersion[i])>parseInt(localAndroidVersion[i])){ isUpload=true; } } if(response.code==1){ var data=response.data; if(isUpload==true){ // 下載檔案資源到本地,下載剛才打包的 .wgt檔案 uni.downloadFile({ url: "http://api.yunshanghulian.net/__UNI__F89F8A7.wgt", // 下載資源的 url success: (downloadResult) => { if (downloadResult.statusCode === 200) { /* 安裝應用, 要安裝的檔案路徑(downloadResult.tempFilePath) force 是否強制安裝 true表示強制安裝,不進行版本號的校驗;false則需要版本號校驗, 如果將要安裝應用的版本號不高 於現有應用的版本號則終止安裝,並返回安裝失敗。 僅安裝wgt和wgtu時生效,預設值 false。 */ plus.runtime.install(downloadResult.tempFilePath, { force: true }, function() { // 應用熱重啟,重新啟動進入首頁。 plus.runtime.restart(); isUpload=false; console.log('安裝成功','install success...'); }, function(e) { console.error('安裝失敗','install fail...'); }); } } }); } } }) }); }
plus.runtime.version 或者 uni.getSystemInfo() 讀取到的是 apk/ipa 包的版本號,而非 manifest.json 資源中的版本資訊,所以這裡用 plus.runtime.getProperty() 來獲取相關資訊
安裝 wgt 資源包成功後,必須執行 plus.runtime.restart(),否則新的內容並不會生效。
如果App的原生引擎不升級,只升級wgt包時需要注意測試wgt資源和原生基座的相容性。平臺預設會對不匹配的版本進行提醒,如果自測沒問題,可以在manifest中配置忽略提示,詳見https://ask.dcloud.net.cn/article/35627
注意:
關於熱更新是否影響應用上架
應用市場為了防止開發者不經市場稽核許可,給使用者提供違法內容,對熱更新大多持排斥態度。
但實際上熱更新使用非常普遍,不管是原生開發中還是跨平臺開發。
Apple曾經禁止過jspatch,但沒有打擊其他的熱更新方案,包括cordovar、react native、DCloud。封殺jspatch其實是因為jspatch有嚴重安全漏洞,可以被黑客利用,造成三方黑客可篡改其他App的資料。
使用熱更新需要注意:
上架稽核期間不要彈出熱更新提示
熱更新內容使用https下載,避免被三方網路劫持
不要更新違法內容、不要通過熱更新破壞應用市場的利益,比如iOS的虛擬支付要老老實實給Apple分錢
如果你的應用沒有犯這些錯誤,應用市場是不會管的