<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                > 版本更新是每個APP必備的功能,這里發現一個不錯的版本更新插件,支持“強制更新”、“建議更新”、“wgt增量熱更新” > 插件地址:https://ext.dcloud.net.cn/plugin?id=1643 ## 導入插件 > 插件請求服務端那一部分,就沒有使用他自己封裝的$http,可根據自己需求進行靈活使用 > 導入路徑:/components/APPUpdate/index.js ~~~ // #ifdef APP-PLUS const platform = uni.getSystemInfoSync().platform; // 主顏色 const $mainColor = "FF5B78"; // 彈窗圖標url const $iconUrl = "/static/icon/ic_ar.png"; // 獲取當前應用的版本號 export const getCurrentNo = function(callback) { // 獲取本地應用資源版本號 plus.runtime.getProperty(plus.runtime.appid, function(inf) { callback && callback({ versionCode: inf.versionCode, versionName: inf.version }); }); } // 發起ajax請求獲取服務端版本號 const getServerNo = function(version,isPrompt = false, callback) { let httpData = { version: version.versionCode, // 版本號(整數型 如 101) versionName: version.versionName, // 版本號名稱 (如 1.0.1) type: platform // 手機類型 (android / ios) }; uni.request({ url: 'http://www.liwu4.com/wangkun/version', data: httpData, success: function(res) { let data = res.data.data if (data && data.downloadUrl) { callback && callback(data); } else if (isPrompt) { uni.showToast({ title: "暫無新版本2", icon: "none" }); } }, fail: () => { uni.showToast({ title: "網絡錯誤", icon: "none" }); }, }); /* 接口入參說明 * version: 應用當前版本號(已自動獲取) * versionName: 應用當前版本名稱(已自動獲取) * type:平臺(1101是安卓,1102是IOS) */ /****************以下是示例*******************/ // 可以用自己項目的請求方法 //console.log(version) /* $http.get("api/common/v1/app_version", httpData,{ isPrompt: isPrompt }).then(res => { console.log("res:"+res) if (res && res.downloadUrl) { callback && callback(res); } else if (isPrompt) { uni.showToast({ title: "暫無新版本2", icon: "none" }); } }); */ /* res的數據說明 * | 參數名稱 | 一定返回 | 類型 | 描述 * | -------------|--------- | --------- | ------------- | * | versionCode | y | int | 版本號 | * | versionName | y | String | 版本名稱 | * | versionInfo | y | String | 版本信息 | * | forceUpdate | y | boolean | 是否強制更新 | * | downloadUrl | y | String | 版本下載鏈接(IOS安裝包更新請放跳轉store應用商店鏈接,安卓apk和wgt文件放文件下載鏈接) | */ /****************以上是示例*******************/ } // 從服務器下載應用資源包(wgt文件) const getDownload = function(data) { let popupData = { progress: true, buttonNum: 2 }; if(data.forceUpdate){ popupData.buttonNum = 0; } let dtask; let lastProgressValue = 0; let popupObj = downloadPopup(popupData); dtask = plus.downloader.createDownload(data.downloadUrl, { filename: "_doc/update/" }, function(download, status) { if (status == 200) { popupObj.change({ progressValue: 100, progressTip:"正在安裝文件...", progress: true, buttonNum: 0 }); plus.runtime.install(download.filename, {}, function() { popupObj.change({ contentText: "應用資源更新完成!", buttonNum: 1, progress: false }); }, function(e) { popupObj.cancel(); plus.nativeUI.alert("安裝文件失敗[" + e.code + "]:" + e.message); }); } else { popupObj.change({ contentText: "文件下載失敗...", buttonNum: 1, progress: false }); } }); dtask.start(); dtask.addEventListener("statechanged", function(task, status) { switch (task.state) { case 1: // 開始 popupObj.change({ progressValue:0, progressTip:"準備下載...", progress: true }); break; case 2: // 已連接到服務器 popupObj.change({ progressValue:0, progressTip:"開始下載...", progress: true }); break; case 3: const progress = parseInt(task.downloadedSize / task.totalSize * 100); if(progress - lastProgressValue >= 2){ lastProgressValue = progress; popupObj.change({ progressValue:progress, progressTip: "已下載" + progress + "%", progress: true }); } break; } }); // 取消下載 popupObj.cancelDownload = function(){ dtask && dtask.abort(); uni.showToast({ title: "已取消下載", icon:"none" }); } // 重啟APP popupObj.reboot = function(){ plus.runtime.restart(); } } // 文字換行 function drawtext(text, maxWidth) { let textArr = text.split(""); let len = textArr.length; // 上個節點 let previousNode = 0; // 記錄節點寬度 let nodeWidth = 0; // 文本換行數組 let rowText = []; // 如果是字母,側保存長度 let letterWidth = 0; // 漢字寬度 let chineseWidth = 14; // otherFont寬度 let otherWidth = 7; for (let i = 0; i < len; i++) { if (/[\u4e00-\u9fa5]|[\uFE30-\uFFA0]/g.test(textArr[i])) { if(letterWidth > 0){ if(nodeWidth + chineseWidth + letterWidth * otherWidth > maxWidth){ rowText.push({ type: "text", content: text.substring(previousNode, i) }); previousNode = i; nodeWidth = chineseWidth; letterWidth = 0; } else { nodeWidth += chineseWidth + letterWidth * otherWidth; letterWidth = 0; } } else { if(nodeWidth + chineseWidth > maxWidth){ rowText.push({ type: "text", content: text.substring(previousNode, i) }); previousNode = i; nodeWidth = chineseWidth; }else{ nodeWidth += chineseWidth; } } } else { if(/\n/g.test(textArr[i])){ rowText.push({ type: "break", content: text.substring(previousNode, i) }); previousNode = i + 1; nodeWidth = 0; letterWidth = 0; }else if(textArr[i] == "\\" && textArr[i + 1] == "n"){ rowText.push({ type: "break", content: text.substring(previousNode, i) }); previousNode = i + 2; nodeWidth = 0; letterWidth = 0; }else if(/[a-zA-Z0-9]/g.test(textArr[i])){ letterWidth += 1; if(nodeWidth + letterWidth * otherWidth > maxWidth){ rowText.push({ type: "text", content: text.substring(previousNode, i + 1 - letterWidth) }); previousNode = i + 1 - letterWidth; nodeWidth = letterWidth * otherWidth; letterWidth = 0; } } else{ if(nodeWidth + otherWidth > maxWidth){ rowText.push({ type: "text", content: text.substring(previousNode, i) }); previousNode = i; nodeWidth = otherWidth; }else{ nodeWidth += otherWidth; } } } } if (previousNode < len) { rowText.push({ type: "text", content: text.substring(previousNode, len) }); } return rowText; } // 是否更新彈窗 function updatePopup(data, callback) { // 彈窗遮罩層 let maskLayer = new plus.nativeObj.View("maskLayer", { //先創建遮罩層 top: '0px', left: '0px', height: '100%', width: '100%', backgroundColor: 'rgba(0,0,0,0.5)' }); // 以下為計算菜單的nview繪制布局,為固定算法,使用者無關關心 const screenWidth = plus.screen.resolutionWidth; const screenHeight = plus.screen.resolutionHeight; //彈窗容器寬度 const popupViewWidth = screenWidth * 0.7; // 彈窗容器的Padding const viewContentPadding = 20; // 彈窗容器的寬度 const viewContentWidth = parseInt(popupViewWidth - (viewContentPadding * 2)); // 描述的列表 const descriptionList = drawtext(data.versionInfo, viewContentWidth); // 彈窗容器高度 let popupViewHeight = 80 + 20 + 20 + 90 + 10; let popupViewContentList = [{ src: $iconUrl, id: "logo", tag: "img", position: { top: "0px", left: (popupViewWidth - 124) / 2 + "px", width: "124px", height: "80px", } }, { tag: 'font', id: 'title', text: "發現新版本" + data.versionName, textStyles: { size: '18px', color: "#333", weight: "bold", whiteSpace: "normal" }, position: { top: '90px', left: viewContentPadding + "px", width: viewContentWidth + "px", height: "30px", } }]; const textHeight = 18; let contentTop = 130; descriptionList.forEach((item,index) => { if(index > 0){ popupViewHeight += textHeight; contentTop += textHeight; } popupViewContentList.push({ tag: 'font', id: 'content' + index + 1, text: item.content, textStyles: { size: '14px', color: "#666", lineSpacing: "50%", align: "left" }, position: { top: contentTop + "px", left: viewContentPadding + "px", width: viewContentWidth + "px", height: textHeight + "px", } }); if(item.type == "break"){ contentTop += 10; popupViewHeight += 10; } }); // 彈窗內容 let popupView = new plus.nativeObj.View("popupView", { //創建底部圖標菜單 tag: "rect", top: (screenHeight - popupViewHeight) / 2 + "px", left: '15%', height: popupViewHeight + "px", width: "70%" }); // 繪制白色背景 popupView.drawRect({ color: "#FFFFFF", radius: "8px" }, { top: "40px", height: popupViewHeight - 40 + "px", }); // 繪制底邊按鈕 popupView.drawRect({ radius: "3px", borderColor: "#f1f1f1", borderWidth: "1px", }, { bottom: viewContentPadding + 'px', left: viewContentPadding + "px", width: (viewContentWidth - viewContentPadding) / 2 + "px", height: "30px", }); // 繪制底邊按鈕 popupView.drawRect({ radius: "3px", color: $mainColor, }, { bottom: viewContentPadding + 'px', left: ((viewContentWidth - viewContentPadding) / 2 + viewContentPadding * 2) + "px", width: (viewContentWidth - viewContentPadding) / 2 + "px", height: "30px", }); popupViewContentList.push({ tag: 'font', id: 'cancelText', text: "暫不升級", textStyles: { size: '14px', color: "#666", lineSpacing: "0%", whiteSpace: "normal" }, position: { bottom: viewContentPadding + 'px', left: viewContentPadding + "px", width: (viewContentWidth - viewContentPadding) / 2 + "px", height: "30px", } }); popupViewContentList.push({ tag: 'font', id: 'confirmText', text: "立即升級", textStyles: { size: '14px', color: "#FFF", lineSpacing: "0%", whiteSpace: "normal" }, position: { bottom: viewContentPadding + 'px', left: ((viewContentWidth - viewContentPadding) / 2 + viewContentPadding * 2) + "px", width: (viewContentWidth - viewContentPadding) / 2 + "px", height: "30px", } }); popupView.draw(popupViewContentList); popupView.addEventListener("click", function(e) { let maxTop = popupViewHeight - viewContentPadding; let maxLeft = popupViewWidth - viewContentPadding; let buttonWidth = (viewContentWidth - viewContentPadding) / 2; if (e.clientY > maxTop - 30 && e.clientY < maxTop) { // 暫不升級 if (e.clientX > viewContentPadding && e.clientX < maxLeft - buttonWidth - viewContentPadding) { maskLayer.hide(); popupView.hide(); } else if (e.clientX > maxLeft - buttonWidth && e.clientX < maxLeft) { // 立即升級 maskLayer.hide(); popupView.hide(); callback && callback(); } } }); // 點擊遮罩層 maskLayer.addEventListener("click", function() { //處理遮罩層點擊 maskLayer.hide(); popupView.hide(); }); // 顯示彈窗 maskLayer.show(); popupView.show(); } // 文件下載的彈窗繪圖 function downloadPopupDrawing(data){ // 以下為計算菜單的nview繪制布局,為固定算法,使用者無關關心 const screenWidth = plus.screen.resolutionWidth; const screenHeight = plus.screen.resolutionHeight; //彈窗容器寬度 const popupViewWidth = screenWidth * 0.7; // 彈窗容器的Padding const viewContentPadding = 20; // 彈窗容器的寬度 const viewContentWidth = popupViewWidth - (viewContentPadding * 2); // 彈窗容器高度 let popupViewHeight = viewContentPadding * 3 + 60; let progressTip = data.progressTip || "準備下載..."; let contentText = data.contentText || "正在為您更新,請耐心等待"; let elementList = [ { tag: 'rect', //背景色 color: '#FFFFFF', rectStyles:{ radius: "8px" } }, { tag: 'font', id: 'title', text: "升級APP", textStyles: { size: '16px', color: "#333", weight: "bold", verticalAlign: "middle", whiteSpace: "normal" }, position: { top: viewContentPadding + 'px', height: "30px", } }, { tag: 'font', id: 'content', text: contentText, textStyles: { size: '14px', color: "#333", verticalAlign: "middle", whiteSpace: "normal" }, position: { top: viewContentPadding * 2 + 30 + 'px', height: "20px", } } ]; // 是否有進度條 if(data.progress){ popupViewHeight += viewContentPadding + 40; elementList = elementList.concat([ { tag: 'font', id: 'progressValue', text: progressTip, textStyles: { size: '14px', color: $mainColor, whiteSpace: "normal" }, position: { top: viewContentPadding * 4 + 20 + 'px', height: "30px" } }, { tag: 'rect', //繪制進度條背景 id: 'progressBg', rectStyles:{ radius: "4px", borderColor: "#f1f1f1", borderWidth: "1px", }, position:{ top: viewContentPadding * 4 + 60 + 'px', left: viewContentPadding + "px", width: viewContentWidth + "px", height: "8px" } }, ]); } if (data.buttonNum == 2) { popupViewHeight += viewContentPadding + 30; elementList = elementList.concat([ { tag: 'rect', //繪制底邊按鈕 rectStyles:{ radius: "3px", borderColor: "#f1f1f1", borderWidth: "1px", }, position:{ bottom: viewContentPadding + 'px', left: viewContentPadding + "px", width: (viewContentWidth - viewContentPadding) / 2 + "px", height: "30px" } }, { tag: 'rect', //繪制底邊按鈕 rectStyles:{ radius: "3px", color: $mainColor }, position:{ bottom: viewContentPadding + 'px', left: ((viewContentWidth - viewContentPadding) / 2 + viewContentPadding * 2) + "px", width: (viewContentWidth - viewContentPadding) / 2 + "px", height: "30px" } }, { tag: 'font', id: 'cancelText', text: "取消下載", textStyles: { size: '14px', color: "#666", lineSpacing: "0%", whiteSpace: "normal" }, position: { bottom: viewContentPadding + 'px', left: viewContentPadding + "px", width: (viewContentWidth - viewContentPadding) / 2 + "px", height: "30px", } }, { tag: 'font', id: 'confirmText', text: "后臺下載", textStyles: { size: '14px', color: "#FFF", lineSpacing: "0%", whiteSpace: "normal" }, position: { bottom: viewContentPadding + 'px', left: ((viewContentWidth - viewContentPadding) / 2 + viewContentPadding * 2) + "px", width: (viewContentWidth - viewContentPadding) / 2 + "px", height: "30px", } } ]); } if (data.buttonNum == 1) { popupViewHeight += viewContentPadding + 40; elementList = elementList.concat([ { tag: 'rect', //繪制底邊按鈕 rectStyles:{ radius: "6px", color: $mainColor }, position:{ bottom: viewContentPadding + 'px', left: viewContentPadding + "px", width: viewContentWidth + "px", height: "40px" } }, { tag: 'font', id: 'confirmText', text: "關閉", textStyles: { size: '14px', color: "#FFF", lineSpacing: "0%", }, position: { bottom: viewContentPadding + 'px', left: viewContentPadding + "px", width: viewContentWidth + "px", height: "40px" } } ]); } return { popupViewHeight:popupViewHeight, popupViewWidth:popupViewWidth, screenHeight:screenHeight, viewContentWidth:viewContentWidth, viewContentPadding:viewContentPadding, elementList: elementList }; } // 文件下載的彈窗 function downloadPopup(data) { // 彈窗遮罩層 let maskLayer = new plus.nativeObj.View("maskLayer", { //先創建遮罩層 top: '0px', left: '0px', height: '100%', width: '100%', backgroundColor: 'rgba(0,0,0,0.5)' }); let popupViewData = downloadPopupDrawing(data); // 彈窗內容 let popupView = new plus.nativeObj.View("popupView", { //創建底部圖標菜單 tag: "rect", top: (popupViewData.screenHeight - popupViewData.popupViewHeight) / 2 + "px", left: '15%', height: popupViewData.popupViewHeight + "px", width: "70%", }); let progressValue = 0; let progressTip = 0; let contentText = 0; let buttonNum = 2; if(data.buttonNum >= 0){ buttonNum = data.buttonNum; } popupView.draw(popupViewData.elementList); let callbackData = { change: function(res) { let progressElement = []; if(res.progressValue){ progressValue = res.progressValue; // 繪制進度條 progressElement.push({ tag: 'rect', //繪制進度條背景 id: 'progressValueBg', rectStyles:{ radius: "4px", color: $mainColor }, position:{ top: popupViewData.viewContentPadding * 4 + 60 + 'px', left: popupViewData.viewContentPadding + "px", width: popupViewData.viewContentWidth * (res.progressValue / 100) + "px", height: "8px" } }); } if(res.progressTip){ progressTip = res.progressTip; progressElement.push({ tag: 'font', id: 'progressValue', text: res.progressTip, textStyles: { size: '14px', color: $mainColor, whiteSpace: "normal" }, position: { top: popupViewData.viewContentPadding * 4 + 20 + 'px', height: "30px" } }); } if(res.contentText){ contentText = res.contentText; progressElement.push({ tag: 'font', id: 'content', text: res.contentText, textStyles: { size: '16px', color: "#333", whiteSpace: "normal" }, position: { top: popupViewData.viewContentPadding * 2 + 30 + 'px', height: "30px", } }); } if(res.buttonNum >= 0 && buttonNum != res.buttonNum){ buttonNum = res.buttonNum; popupView.reset(); popupViewData = downloadPopupDrawing(Object.assign({ progressValue:progressValue, progressTip:progressTip, contentText:contentText, },res)); let newElement = []; popupViewData.elementList.map((item,index) => { let have = false; progressElement.forEach((childItem,childIndex) => { if(item.id == childItem.id){ have = true; } }); if(!have){ newElement.push(item); } }); progressElement = newElement.concat(progressElement); popupView.setStyle({ tag: "rect", top: (popupViewData.screenHeight - popupViewData.popupViewHeight) / 2 + "px", left: '15%', height: popupViewData.popupViewHeight + "px", width: "70%", }); popupView.draw(progressElement); }else{ popupView.draw(progressElement); } }, cancel: function() { maskLayer.hide(); popupView.hide(); } } popupView.addEventListener("click", function(e) { let maxTop = popupViewData.popupViewHeight - popupViewData.viewContentPadding; let maxLeft = popupViewData.popupViewWidth - popupViewData.viewContentPadding; if (e.clientY > maxTop - 40 && e.clientY < maxTop) { if(buttonNum == 1){ // 單按鈕 if (e.clientX > popupViewData.viewContentPadding && e.clientX < maxLeft) { maskLayer.hide(); popupView.hide(); callbackData.reboot(); } }else if(buttonNum == 2){ // 雙按鈕 let buttonWidth = (popupViewData.viewContentWidth - popupViewData.viewContentPadding) / 2; if (e.clientX > popupViewData.viewContentPadding && e.clientX < maxLeft - buttonWidth - popupViewData.viewContentPadding) { maskLayer.hide(); popupView.hide(); callbackData.cancelDownload(); } else if (e.clientX > maxLeft - buttonWidth && e.clientX < maxLeft) { maskLayer.hide(); popupView.hide(); } } } }); // 顯示彈窗 maskLayer.show(); popupView.show(); // 改變進度條 return callbackData; } export default function(isPrompt = false) { getCurrentNo(versionInfo => { getServerNo(versionInfo,isPrompt, res => { if (res.forceUpdate) { if (/\.wgt$/i.test(res.downloadUrl)) { console.log('aaaa1') getDownload(res); } else if(/\.html$/i.test(res.downloadUrl)){ console.log('aaaa2') plus.runtime.openURL(res.downloadUrl); } else { if (platform == "android") { console.log('aaaa3') getDownload(res); } else { console.log('aaaa4') plus.runtime.openURL(res.downloadUrl); } } } else { updatePopup(res, function() { if (/\.wgt$/i.test(res.downloadUrl)) { console.log('ccc1') getDownload(res); } else if(/\.html$/i.test(res.downloadUrl)){ console.log('cccc2') plus.runtime.openURL(res.downloadUrl); } else { if (platform == "android") { console.log('cccc4') getDownload(res); } else { console.log('cccc5') plus.runtime.openURL(res.downloadUrl); } } }); } }); }); } // #endif ~~~ ## 前端頁面調用 ~~~ <template> <view> <button type="default" @click="getVersion">get version</button> <button type="default" @click="updateVersion">update version</button> </view> </template> <script> import APPUpdate, { getCurrentNo } from '../../components/APPUpdate/index.js'; export default { methods: { getVersion() { getCurrentNo(res => { console.log(res) console.log(res.versionName) }); }, updateVersion() { APPUpdate(true); } } } </script> ~~~ ## 服務端代碼 ~~~ public function actionVersion() { $version = get('version'); $versionName = get('versionName'); $type = get('type'); if ($type == 'android') { // android jsonSuccess([ "versionCode" => 101, "versionName" => "1.0.1", "versionInfo" => "1.修改了bug1 \n 2.修改了bug2 \n 3.修改了bug3", "forceUpdate" => false, "downloadUrl" => "http://www.baidu.com/", ]); }else{ // ios jsonSuccess([ "versionCode" => 101, "versionName" => "1.0.1", "versionInfo" => "1.修改了bug1 \n 2.修改了bug2 \n 3.修改了bug3", "forceUpdate" => false, "downloadUrl" => "http://www.baidu.com/", ]); } } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看