uniapp熱更新和整包升級


一. uniapp熱更新  (熱更新官方文檔)

  很多人在開發uniapp的時候, 發現熱更新失效問題(或者熱更新沒有更新manifest里的新增模塊,SDK,原生插件包括雲插件), 其實uniapp官網也寫了

 

 

   簡單的來說,manifest里面的東西是, 就比如 app圖標,啟動屏, 增加了map模塊等,勾選了其他的sdk,增加了原生插件等都會引起熱更新問題,

  這時候就需要整包升級。

  

  但是拋開這些 manifest的修改,熱更新還是很方便的,代碼如下:

  

在 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  //是否校驗版本 true不校驗
                            }, function() {  
                                console.log('install success...');  
                                plus.runtime.restart();  //熱更新要重新啟動才能生效
                            }, function(e) {  
                                console.error('install fail...');  
                            });  
                        }  
                    }  
                });  
            }  
        }  
    });  
});  
// #endif

 

二. uniapp整包升級  (整包升級官方文檔)

 

  整包升級代碼:

在App.vue的onLaunch中,發起升級檢測請求,如下:

onLaunch: function () {  
    //#ifdef APP-PLUS  
    var server = "https://www.example.com/update"; //檢查更新地址  
    var req = { //升級檢測數據  
        "appid": plus.runtime.appid,  
        "version": plus.runtime.version  
    };  
    uni.request({  
        url: server,  
        data: req,  
        success: (res) => {  
            if (res.statusCode == 200 && res.data.status === 1) {  
                uni.showModal({ //提醒用戶更新  
                    title: "更新提示",  
                    content: res.data.note,  
                    success: (res) => {  
                        if (res.confirm) {  
                            plus.runtime.openURL(res.data.url);  
                        }  
                    }  
                })  
            }  
        }  
    })  
    //#endif  
}

注意:App的升級檢測代碼必須使用條件編譯,否則在非App環境由於不存在plus相關API,將會報錯。

升級地址URL,如果是自行托管的App,就提供自己的包地址。如果是打開應用市場,那URL如下:

if (plus.os.name=="Android") {  
    appurl = "market://details?id=io.dcloud.hellouniapp"; //這個是通用應用市場,如果想指定某個應用商店,需要單獨查這個應用商店的包名或scheme及參數  
}  
else{  
    appurl = "itms-apps://itunes.apple.com/cn/app/hello-uni-app/id1417078253";  
}

 

服務端實現

根據客戶端上報的版本號,比對服務端最新版本號,決定是否需要升級,若需升級則返回升級信息(rease notes、更新包地址等)

實現示例:

  1. 【推薦】通過uniCloud的雲函數模板,快速實現升級檢查邏輯,詳情參考:https://ext.dcloud.net.cn/plugin?id=4470
  2. php示例代碼:

  

header("Content-type:text/json");  
$appid = $_GET["appid"];  
$version = $_GET["version"]; //客戶端版本號  
$rsp = array("status" => 0); //默認返回值,不需要升級  
if (isset($appid) && isset($version)) {  
    if ($appid === "__UNI__123456") { //校驗appid  
        if ($version !== "1.0.1") { //這里是示例代碼,真實業務上,最新版本號及relase notes可以存儲在數據庫或文件中  
            $rsp["status"] = 1;  
            $rsp["note"] = "修復bug1;\n修復bug2;"; //release notes  
            $rsp["url"] = "http://www.example.com/uniapp.apk"; //應用升級包下載地址  
        }  
    }  
}   
echo json_encode($rsp);  
exit;

常見問題

  1. 版本檢測需要打包app,真機運行基座無法測試。因為真機運行的plus.runtime.version是固定值。


免責聲明!

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



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