插件市场
1.安卓apk下载完成后没有更新APP
答:问题是因为没有添加APP安装应用权限,解决方法在manifest.json文件里面APP模块权限配置的Android打包权限配置勾选以下权限
创建新文件夹config/componentConfig.js
import $http from '../common/request.js';
const platform = SystemInfoSync().platform;//获取运行环境 比如安卓 IOS
export default {// 发起ajax请求获取服务端版本号getServerNo: (version, isPrompt = false, callback) => {$("/appversion").then(res => {//对比版本号大于 就提示弹框更新 不大于就不提示if(res.versioncode > version.versionCode){if (res && res.downloadurl) {callback && callback(res);}}/* res的数据说明* | 参数名称 | 一定返回 | 类型 | 描述* | -------------|--------- | --------- | ------------- |* | versioncode | y | int | 版本号 |* | versionname | y | String | 版本名称 |* | versioninfo | y | String | 版本信息 |* | updatetype | y | String | forcibly = 强制更新, solicit = 弹窗确认更新, silent = 静默更新 |* | downloadurl | y | String | 版本下载链接(IOS安装包更新请放跳转store应用商店链接,安卓apk和wgt文件放文件下载链接) |*/});},// 弹窗主颜色(不填默认粉色)appUpdateColor: "f00",// 弹窗图标(不填显示默认图标,链接配置示例如: '/static/demo/ic_attention.png')appUpdateIcon: ''
}
APP.vue配置
<script>// #ifdef APP-PLUSimport APPUpdate from '@/uni_modules/zhouWei-APPUpdate/js_sdk/appUpdate';// #endifexport default {onLaunch: function() {console.log('App Launch')// #ifdef APP-PLUSAPPUpdate();// #endif},onShow: function() {console.log('App Show')},onHide: function() {console.log('App Hide')},}
</script>
数据库表的最基本字段
// app/model/ports = app => {const { STRING, INTEGER, DATE, ENUM, TEXT } = app.Sequelize;const Version = del.define('version', {id: {type: INTEGER(20),primaryKey: true,autoIncrement: true,unique: true},username: {type: STRING(11),allowNull: false,defaultValue: '',comment: '用户名',},versioncode: {type: INTEGER,allowNull: false,defaultValue: '0',comment: '版本号',},versionname: {type: STRING(30),allowNull: false,defaultValue: '',comment: '版本名称',},versioninfo: {type: STRING(500),allowNull: false,defaultValue: '',comment: '版本信息',},downloadurl: {type: STRING(100),allowNull: false,defaultValue: '',comment: ' 版本下载链接(IOS安装包更新请放跳转store应用商店链接,安卓apk和wgt文件放文件下载链接)',},updatetype: {type: ENUM,values: ["forcibly", 'solicit','silent'],allowNull: false,defaultValue: 'solicit',comment: '更新类型:forcibly = 强制更新, solicit = 弹窗确认更新, silent = 静默更新'},created_time: {type:DATE,get(){ return app.DataValue('created_time'))}},updated_time: DATE,});return Version;};
appUpdate.js 文件内容
// #ifdef APP-PLUS
import componentConfig from "@/config/componentConfig"
const platform = SystemInfoSync().platform;
// 主颜色
const $mainColor = componentConfig.appUpdateColor ? componentConfig.appUpdateColor : "FF5B78";
// 弹窗图标url
const $iconUrl = componentConfig.appUpdateIcon ? componentConfig.appUpdateIcon : "/uni_modules/zhouWei-APPUpdate/static/ic_ar.png";// 获取当前应用的版本号
export const getCurrentNo = function(callback) {// 获取本地应用资源版本号Property(plus.runtime.appid, function(inf) {callback && callback({versionCode: inf.versionCode, //应用版本号101versionName: inf.version //应用版本名称2.0.0});});
}
// 从服务器下载应用资源包(wgt文件)
const getDownload = function(data) {let dtask;if(data.updatetype == 'forcibly' || data.updatetype == 'solicit'){let popupData = {progress: true,buttonNum: 2};if(data.updatetype == 'forcibly'){popupData.buttonNum = 0;}let lastProgressValue = 0;let popupObj = downloadPopup(popupData);dtask = ateDownload(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 / alSize * 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"});}// 重启boot = function(){start();}} else if(data.updatetype == "silent"){dtask = ateDownload(data.downloadurl, {filename: "_doc/update/"}, function(download, status) {if (status == 200) {plus.runtime.install(download.filename, {}, function() {console.log("应用资源更新完成");}, function(e) {plus.nativeUI.alert("安装文件失败[" + e.code + "]:" + e.message);});} else {plus.nativeUI.alert("文件下载失败...");}});dtask.start();}
}
// 文字换行
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(/st(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 = solutionWidth;const screenHeight = solutionHeight;//弹窗容器宽度const popupViewWidth = screenWidth * 0.7;// 弹窗容器的Paddingconst 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: t,textStyles: {size: '14px',color: "#666",lineSpacing: "50%",align: "left"},position: {top: contentTop + "px",left: viewContentPadding + "px",width: viewContentWidth + "px",height: textHeight + "px",}});pe == "break"){contentTop += 10;popupViewHeight += 10;}});if(data.updatetype == "forcibly"){popupViewContentList.push({tag: 'rect', //绘制底边按钮rectStyles:{radius: "6px",color: $mainColor},position:{bottom: viewContentPadding + 'px',left: viewContentPadding + "px",width: viewContentWidth + "px",height: "30px"}});popupViewContentList.push({tag: 'font',id: 'confirmText',text: "立即升级",textStyles: {size: '14px',color: "#FFF",lineSpacing: "0%",},position: {bottom: viewContentPadding + 'px',left: viewContentPadding + "px",width: viewContentWidth + "px",height: "30px"}});} else {// 绘制底边按钮popupViewContentList.push({tag: 'rect',id: 'cancelBox',rectStyles: {radius: "3px",borderColor: "#f1f1f1",borderWidth: "1px",},position: {bottom: viewContentPadding + 'px',left: viewContentPadding + "px",width: (viewContentWidth - viewContentPadding) / 2 + "px",height: "30px",}});popupViewContentList.push({tag: 'rect',id: 'confirmBox',rectStyles: {radius: "3px",color: $mainColor,},position: {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",}});}// 弹窗内容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.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(data.updatetype == "forcibly"){if(e.clientX > viewContentPadding && e.clientX < maxLeft){// 立即升级maskLayer.hide();popupView.hide();callback && callback();}} else {// 暂不升级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();}}}});if(data.updatetype == "solicit"){// 点击遮罩层maskLayer.addEventListener("click", function() { //处理遮罩层点击maskLayer.hide();popupView.hide();});}// 显示弹窗maskLayer.show();popupView.show();
}
// 文件下载的弹窗绘图
function downloadPopupDrawing(data){// 以下为计算菜单的nview绘制布局,为固定算法,使用者无关关心const screenWidth = solutionWidth;const screenHeight = solutionHeight;//弹窗容器宽度const popupViewWidth = screenWidth * 0.7;// 弹窗容器的Paddingconst viewContentPadding = 20;// 弹窗容器的宽度const viewContentWidth = popupViewWidth - (viewContentPadding * 2);// 弹窗容器高度let popupViewHeight = viewContentPadding * 3 + 60;let progressTip = data.progressTip || "准备下载...";let contentText = tText || "正在为您更新,请耐心等待";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 = at([{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 = at([{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 = at([{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"}});}tText){contentText = tText;progressElement.push({tag: 'font',id: 'content',text: tText,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.set();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 = at(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();boot();}}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 => {ServerNo(versioninfo, isPrompt, res => {if (res.updatetype == "forcibly" || res.updatetype == "silent") {if (/.wgt$/i.test(res.downloadurl)) {getDownload(res);} else if(/.html$/i.test(res.downloadurl)){plus.runtime.openURL(res.downloadurl);} else {if (platform == "android") {getDownload(res);} else {plus.runtime.openURL(res.downloadurl);}}} else if(res.updatetype == "solicit"){updatePopup(res, function() {if (/.wgt$/i.test(res.downloadurl)) {getDownload(res);} else if(/.html$/i.test(res.downloadurl)){plus.runtime.openURL(res.downloadurl);} else {if (platform == "android") {getDownload(res);} else {plus.runtime.openURL(res.downloadurl);}}});}});});
}
// #endif
插件的目录结构
本文发布于:2024-01-28 19:52:52,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17064427779870.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |