一. 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、更新包地址等)
實現示例:
- 【推薦】通過uniCloud的雲函數模板,快速實現升級檢查邏輯,詳情參考:https://ext.dcloud.net.cn/plugin?id=4470
- 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;
常見問題
- 版本檢測需要打包app,真機運行基座無法測試。因為真機運行的plus.runtime.version是固定值。