【uniapp 開發】uni-app 資源在線升級/熱更新


注:本文為前端代碼資源熱更新。如果是整包升級,另見文檔 https://ask.dcloud.net.cn/article/34972

HBuilderX 1.6.5 起,uni-app 支持生成 App 資源升級包。

生成 App 資源升級包

修改版本號

首先,更新 manifest.json 中的版本號。
比如之前是 1.0.0,那么新版本應該是 1.0.1 或 1.1.0 這樣。

發行

然后,在 HBuilderX 中生成升級包(wgt)。
菜單->發行->原生App-制作移動App資源升級包

生成結束會在控制台告知升級包的輸出位置。

安裝資源升級包

應用的升級需要服務端與客戶端配合完成,下面以本地測試過程中的操作舉例說明:

存放資源

將 %appid%.wgt 文件存放在服務器的 static 目錄下,即 http://www.example.com/static/UNI832D722.wgt。

客戶端檢測升級

在 App.vue 的 onLaunch 中檢測升級,代碼如下:

// #ifdef APP-PLUS  
plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) {  
   uni.request({  
       url: 'http://www.example.com/update/',  
       data: {  
           version: widgetInfo.version,  
           name: widgetInfo.name  
       },  
       success: (result) => {  
           var data = result.data;  
           if (data.update && data.wgtUrl) {  
               uni.downloadFile({  
                   url: data.wgtUrl,  
                   success: (downloadResult) => {  
                       if (downloadResult.statusCode === 200) {  
                           plus.runtime.install(downloadResult.tempFilePath, {  
                               force: false  
                           }, function() {  
                               console.log('install success...');  
                               plus.runtime.restart();  
                           }, function(e) {  
                               console.error('install fail...');  
                           });  
                       }  
                   }  
               });  
           }  
       }  
   });  
});  
// #endif  

不支持的情況

  • SDK 部分有調整,比如新增了 Maps 模塊等,不可通過此方式升級,必須通過整包的方式升級。
  • 如果是老的非自定義組件編譯模式,之前沒有 nvue 文件,但更新中新增了 nvue 文件,不能使用此方式。因為非自定義組件編譯模式如果沒有nvue文件是不會打包weex引擎進去的,原生引擎無法動態添加。自定義組件模式默認就含着weex引擎,不管工程下有沒有nvue文件。
  • 原生插件的增改,同樣不能使用此方式。

注意事項

  • 條件編譯,僅在 App 平台執行此升級邏輯。
  • appid 以及版本信息等,在 HBuilderX 真機運行開發期間,均為 HBuilder 這個應用的信息,因此需要打包自定義基座或正式包測試升級功能。
  • 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
  • www.example.com 是一個僅用做示例說明的地址,實際應用中應該是真實的 IP 或有效域名,請勿直接復制粘貼使用。

關於熱更新是否影響應用上架

應用市場為了防止開發者不經市場審核許可,給用戶提供違法內容,對熱更新大多持排斥態度。

但實際上熱更新使用非常普遍,不管是原生開發中還是跨平台開發。

Apple曾經禁止過jspatch,但沒有打擊其他的熱更新方案,包括cordovar、react native、DCloud。封殺jspatch其實是因為jspatch有嚴重安全漏洞,可以被黑客利用,造成三方黑客可篡改其他App的數據。

使用熱更新需要注意:

  • 上架審核期間不要彈出熱更新提示
  • 熱更新內容使用https下載,避免被三方網絡劫持
  • 不要更新違法內容、不要通過熱更新破壞應用市場的利益,比如iOS的虛擬支付要老老實實給Apple分錢
  • 如果你的應用沒有犯這些錯誤,應用市場是不會管的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM