uniapp的安卓升级功能说明

目录

1.实现思路

2.app代码示例

3.说明


1.实现思路

①将安装包存储在后台服务器。

创建版本信息表,存储安装包的相关信息。保存安装包的名称,版本号,网络地址,是否强制升级,发布时间信息及升级内容等。表结构如下:

开发前端画面,设置版本的发布时间,版本号,是否强制及升级内容,并上传安装包。

后端将安装包的信息存储到数据库的版本表中,并将安装包上传到服务器上。

②获取后端的版本信息

获取发布时间小于等于系统时间的按照版本号或者创建时间进行降序排列的第一条数据,即最新的版本信息。

如果app的版本号和最新的版本号差了不只一个版本,则设置为强制升级;否则则按照最新app的强制升级区分进行处理。

3.app端处理

将app的版本号作为参数,获取后端的版本信息。

将app的版本号和后端最新的版本号进行比较。

相等则不做任何处理。

当小于最新的版本号时,再判断强制类型。强制时,弹出强制升级框,只有更新按钮,没有取消按钮,安卓的原生返回按钮失效。也就是说必须点击更新按钮,无法进行其他操作。非强制升级时,弹出升级框,有更新按钮和取消按钮,按照需要进行升级。

2.app代码示例

①升级判断方法

import { getUpdateInfo } from '@/api/appUpdate'
import { ref } from 'vue';export default function AppUpdate() {// 获取运行平台let platform = uni.getSystemInfoSync().platform// 获取appidconst appId : any = plus.runtime.appid// 获取当前app的版本信息const version = ref();plus.runtime.getProperty(appId, (inf) => {version.value = inf.versionCode/*2, 用当前版本号提交给服务端,判断是否需要更新,接口返回信息如下versionCode	版本号	stringappPath	apk地址	stringforceType	是否强制更新	stringcontent	升级内容	string*/getUpdateInfo({ versionCode: version.value }).then((res) => {if (res.data.resHdr && res.data.resHdr.resCode != "0000") {return}if (!res.data.resBody) {return}const {versionCode,appPath,forceType,content} = res.data.resBody;// 后台返回的版本号大于现有的版本号if (Number(versionCode) > Number(inf.versionCode)) {//modify 1 强制更新 0 自然更新if (forceType) {uni.showModal({title: '紧急升级通知',content: '尊敬的用户,为了您更好的使用体验,请进行系统升级,否则将无法正常使用。感谢您的配合与支持!\r\n升级内容:' + content,confirmText: '立即更新',showCancel: false,success: function (res) {if (res.confirm) {// uni.showToast({// 	icon: 'none',// 	title: '有新的版本发布,程序已启动自动更新。',// 	duration: 2000// });//设置 最新版本apk的下载链接 这是固定的let downloadApkUrl = appPathconsole.log(downloadApkUrl);uni.downloadFile({url: downloadApkUrl, //仅为示例,并非真实的资源success: (res) => {if (res.statusCode === 200) {console.log('下载成功');plus.runtime.install(res.tempFilePath, {force: false}, () => {console.log("更新成功")// uni.hideToast();plus.runtime.restart();return;}, err => {console.log("更新失败")uni.showToast({icon: "none",title: "更新失败" + JSON.stringify(err),duration: 2000})})}}});// plus.runtime.openURL(downloadApkUrl);} else {AppUpdate()}}})} else {uni.showModal({title: '升级通知',content: '尊敬的用户,我们为您准备了最新的版本,点击立即升级,享受更多精彩和便利。\r\n升级内容:' + content,confirmText: '立即更新',cancelText: '取消',success: function (res) {if (res.confirm) {// uni.showToast({// 	icon: 'none',// 	title: '有新的版本发布,程序已启动自动更新。',// 	duration: 5000// });//设置 最新版本apk的下载链接 这是固定的 每次把包放在这个链接里里面即可 由后端制作let downloadApkUrl = appPathuni.downloadFile({url: downloadApkUrl, //仅为示例,并非真实的资源success: (res) => {if (res.statusCode === 200) {console.log('下载成功');plus.runtime.install(res.tempFilePath, {force: false}, () => {plus.runtime.restart();console.log("重启成功")return;}, err => {console.log("更新失败")uni.showToast({icon: "none",title: "更新失败" + JSON.stringify(err),duration: 2000})})}}});} else if (res.cancel) {console.log('下次一定');}}});}} else {console.log("版本号已经是最新不用升级")}}).catch((res) => {uni.showToast({title: '获取版本号失败',icon: 'error'})})});}

通过plus命令获取当前app的相关信息,如下:

HTML5+ API Reference 

获取后端的版本信息后,进行版本号的比较,如果存在最新的版本号,则进行强制区分的判断,强制时则弹出强制升级框,否则弹出非强制升级模态框。

升级框通过uni.showModal实现。

强制升级时,设置标题,升级内容,按钮的名字,并设置取消按钮不显示。在打开模态框成功的方法中,通过res.confirm判断点击了升级按钮,点击了升级按钮后,进行安装包的下载,下载成功后进行安装,安装成功后进行重启。如果没有点击升级按钮,则再次执行此方法。

非强制升级时,设置了取消按钮显示,点击了取消按钮,不进行升级操作。点击升级按钮,进行升级操作。

②在首页的setup函数中执行此方法

3.说明

①强制升级安装过程中避免取消操作

安装包安装时,用户可以在安装过程中进行取消,如何避免这个问题?

执行plus.runtime.install方法时,即使用户取消操作,还是会执行成功方法,在成功的方法中添加restart方法,则会避免这个问题,如果用户取消了,则app会重新启动,登录之后再次弹出升级框。

②规避安卓手机原生的返回按钮

弹出强制升级框后,点击原生的返回按钮,可以关闭强制升级框,如何避免这个问题?

(1)通过判断是否点击的升级按钮,如果res.confirm返回true,则代表点击了升级按钮,如果为false,则代表没有点击升级按钮,则再次调用此升级方法进行升级

(2)不使用模态框方式,如果需要强制升级,跳转到强制升级画面,设置画面不能进行返回。

参照:

uniapp实现app版本更新弹窗,处理自主更新以及强制更新_uni-app检测app版本更新-CSDN博客

uniapp APP端在线升级功能实现讲解——强制或可选升级,下载进度显示_plus.runtime.install-CSDN博客

uniapp实现app检查更新与升级-uni-upgrade-center详解-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/658100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Excel中清除单元格的格式?这里有详细步骤

Microsoft Excel提供了大量样式选项来自定义电子表格的外观。但是,如果你需要删除格式,则可以很容易地删除选定单元格和整个工作表的格式。我们将向你展示如何操作。 ​注意:清除格式只会删除文本的样式;将保留你的实际文本。 如…

java.util.LinkedHashSet cannot be cast to java.util.List 的解决方案

出现 “java.util.LinkedHashSet cannot be cast to java.util.List” 的错误,通常是因为你试图将一个 LinkedHashSet 对象直接强制转换为 List 类型。在 Java 中,LinkedHashSet 和 List 是两种不同的集合类型,不能直接进行转换。LinkedHashS…

USB清理软件USBclean轻松清理.DS_Store,Thumbs.db,.Spotlight文件

USBclean for Mac是一款Mac上的USB清理工具,USBclean mac版能够帮助我们快捷方便地为你清理外部磁盘垃圾文件,它支持将.DS_Store, Thumbs.db, .Spotlight 以及回收站中的垃圾文件进行清理。操作也十分简单,只需要将要清理的外部磁盘拖拽到USB…

Linux编辑器之vim的使用

文章目录 一、vim简介二、vim的基本概念三、vim的基本操作四、vim正常模式命令集移动光标删除文字复制替换撤销上一次操作更改跳至指定的行vim末行模式命令集列出行号跳到文件中的某一行查找字符保存文件离开vim 五、进阶vim玩法打开文件批量注释代码执行shell命令指定注释窗口…

harmony开发ohpm mac环境配置

Mac电脑 安装 Ohpm |HarmonyOS 安装 Ohpm ohpm环境配置好后,执行ohpm会报如下的错 ohpm has not been initialized yet. Execute the init script to initialize it first. 解决办法 鸿蒙OS开发,解决报错“ohpm has not been initialized yet…

关于Gitlab用户登录提示无限重定向循环ERR_TOO_MANY_REDIRECTS

#工作笔记# 查阅了网上所有相关的记录,都没有解决gitlab登录/users/sign_up/welcome提示ERR_TOO_MANY_REDIRECTS,好在最终解决了,记录在此。 先说下起因: github哼哼不想用了,原因太多,所以内部讨论用git…

3D人体运动重建

目录 MotioNet FLEX 人格网格重建: VirtualMarker 虚拟人体网格重建 GraMMaR 数据集: MotioNet https://github.com/Shimingyi/MotioNet FLEX https://github.com/BrianG13/FLEX 人格网格重建: CVPR2023:IDEA与清华提出首…

远程访问@HttpExchange

提示:这是SpringBoot3以上的新特性。 远程访问HttpExchange 一、webClient二、Http 服务接口的方法定义三、声明式 HTTP 远程服务1.组合使用注解2.使用单个注解3.定制 HTTP 请求服务 四、总结1.部分方法过时2.过时的方法详解 远程访问是开发的常用技术,一…

java中实现事务的两种方式:编程式事务和声明式事务

涉及到与数据库交互就必须会用到事务,如果一个方法中需要用到事务的地方没有使用事务就会造成数据不一致的风险,进而导致比较严重的bug,比如扣款时,账户的余额已经进行了扣减但是相应的订单没有生成,这种涉及账目的问题…

方法阻塞的解决方案之一

1、简单使用 一个h一个cpp文件 #pragma once #include <iostream> #include <thread> #include <atomic> #include <chrono> #include <string>class Person {public:struct dog {std::string name;int age;};public:void a(std::atomic<bo…

设计模式篇---备忘录模式

文章目录 概念结构实例总结 概念 备忘录模式&#xff1a;在不破坏封装的前提下捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;像这样可以在以后将对象恢复到原先保存的状态。 就好比我们下象棋&#xff0c;下完之后发现走错了&#xff0c;想要回退…

【C++】美感(beautiful)

题目描述 寿寿喜欢有美感的序列。 对于寿寿来说一个序列是有美感的&#xff0c;当且仅当这个序列每两个相邻的数的和是m的倍数。特别的&#xff0c;寿寿认为长度为1的序列也是具有美感的。 寿寿现在随便在纸上写了一个长度为n的序列a&#xff0c;这个序列目前还不具有美感。因此…

Unity 自动轮播、滑动轮播

如图所示&#xff0c;可设置轮播间隔&#xff0c;可左右滑动进行轮播 1.在UGUI创建个Image&#xff0c;添加自动水平组件 2.添加并配置脚本 3.代码如下&#xff0c;都有注释 using UnityEngine; using UnityEngine.UI;public class IndicatorManager : MonoBehaviour {public …

【乳腺肿瘤诊断分类及预测】基于LVQNN学习向量量化神经网络

课题名称&#xff1a;基于LVQ神经网络的乳腺肿瘤诊断&#xff08;类型分类&#xff09; 版本日期&#xff1a;2023-03-10 运行方式: 直接运行0501_LVQ0501.m 文件即可 代码获取方式&#xff1a;私信博主或QQ&#xff1a;491052175 模型描述&#xff1a; 威斯康辛大学医学院…

(HAL)STM32F407ZGT6——10-4 高级定时器 PWM 输入模式实验

一、高级定时器简介 高级定时器的框图和通用定时器框图很类似&#xff0c;只是添加了其它的一些功能&#xff0c;如&#xff1a;重复计数器、带死区控制的互补输出通道、断路输入等。 高级定时器的时钟来自APB2, 而PCLK2 168Mhz, 我们设置PPRE2不分频, 因此高级定时器时钟 …

《微信小程序开发从入门到实战》学习九十九

7.4 视频组件 7.4.1 video组件 支持属性属性如下&#xff1a; 属性类型默认值说明最低版本src&#xff08;必填&#xff09;string要播放视频的资源地址&#xff0c;基础库2.3.0版本开始支持云文件ID1.0.0controlsbooleantrue是否显示默认播放控件&#xff08;播放/暂停按钮…

vue/js 调用系统打印功能进行图片(imgUrl,base64),表格,自定义内容,页面局部区域打印【print-js、html2canvas】

1.打印图片(imgUrl) <template><div><button click"jsonPrint">打印</button></div> </template><script lang"ts"> import printJS from "print-js"; export default {setup() {function jsonPrint(…

使用.NET6 Avalonia开发跨平台三维应用

本文介绍在Vistual Studio 2022中使用Avalonia和集成AnyCAD Rapid AvaloniaUI三维控件的过程。 0 初始化环境 安装Avalonia.Templates dotnet new install Avalonia.Templates若之前安装过可忽略此步骤。 1 创建项目 选择创建AvaloniaUI项目 选一下.NET6版本和Avalonia版…

detectron2的read_image方法

在看代码的时候&#xff0c;看到一行注释&#xff1a;use PIL, to be consistent with evaluation 说是用PIL方法加载&#xff0c;却又看见了BGR这种表述&#xff0c;后面的调用也都是cv2格式&#xff1a; 那我就要看下这里面是怎么实现的了&#xff0c;找到了read_image函数&…

[R] Why data manipulation is crucial and sensitive?

What does a data scientist really do? Identifying the pattern in cultural consumption, making fancy graph, engage a dialogue between data and the existing literature, refining hypothesis….(done within one months with three to four online meetings with p…