uni-app熱更新

紅塵莫藏發表於2020-06-13

開發工具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分錢
如果你的應用沒有犯這些錯誤,應用市場是不會管的

 

相關文章