uni-app 在 APP 端的版本强制更新与热更新

整包更新与热更新的区别

① 整包更新是指下载完整 apk 文件进行覆盖安装

② 热更新是指把 app 有改动的地方打包进 wgt 文件,只更新 wgt 文件中的内容,不进行整包安装,在用户视角也叫做省流量更新

版本号规则约束

建议严格遵循 Semantic Versioning 2.0.0 语义化版本规范。

主版本号:不兼容的 API 修改。
次版本号:向下兼容的功能性新增。
修订号:向下兼容的问题修正。

实现的原理

① 开发后台版本管理功能,每次发版上传 android 安装包,记录版本号、是热更新还是整包更新、是否强制更新等。

② 每次打开 app(onLaunch生命周期)的时候,通过接口请求最新版本信息,再获取当前安装包信息,对比版本号。

③ 如果版本号不一致,且接口获取的版本号大于当前应用的版本号,则进行整包更新或热更新。

④ IOS 并不存在下载安装包覆盖安装这种操作,所以在 IOS 平台需要跳转到 App Store 进行更新。

onLaunch() {this.upgradeAPP(); // APP版本升级
},

在 methods 中

/* APP版本升级 */
upgradeAPP() {// #ifdef APP-PLUS// 只在正式环境下启用,避免更新影响开发和测试环境(这步取决于你的需求)if (process.env.NODE_ENV === "production") {// 获取 app 运行信息plus.runtime.getProperty(plus.runtime.appid, widgetInfo => {// 通过接口获取最新版本信息getVersion({ platform: "1" }).then(res => {if (!res) return;// 版本号得到的是类似 '7.0.1' 的字符串,把它去除.并转为纯数字const appCode = parseInt(res.app_code.split(".").join(""));const version = parseInt(widgetInfo.version.split(".").join(""));// 只有接口版本号 > 当前包版本号才进行更新if (appCode > version && res.type == "0") {this.updateHot(res.download_url); // 热更新,下载更新文件(这一步可以先显示更新提示的 ui,用户点击更新后再下载更新)} else if (appCode > version && res.type == "1") {this.updatePackage(res.download_url); // 整包更新(这一步可以先显示更新提示的 ui,用户点击更新后再下载更新)}});});}// #endif
},
/* 整包更新 */
updatePackage(url) {// IOS 平台不允许这样更新,所以我们需要跳转到 appstore 进行更新if (uni.getSystemInfoSync().platform === "ios") {plus.runtime.launchApplication({ action: "itms-apps://xxx" }); // 调用第三方程序(链接可以通过接口获取)} else {// 构建了下载任务,但此时并未开始下载const dtask = plus.downloader.createDownload(url, {}, (downloadResult, status) => {if (status === 200) {plus.runtime.install(downloadResult.filename,{ force: false },() => {plus.runtime.restart(); // 安装成功后重启},() => {uni.showToast({ icon: "none", title: "下载更新失败" });});}});dtask.start(); // 执行安装包下载,开始下载任务}
},
/* 热更新 */
updateHot(url) {uni.downloadFile({url,success: downloadResult => {if (downloadResult.statusCode === 200) {// 下载更新文件成功后进行安装,force.是否强制安装(如果将要安装应用的版本号不高于现有应用的版本号则终止安装,并返回安装失败)plus.runtime.install(downloadResult.tempFilePath, { force: false }, () => {uni.showToast({ title: "更新完毕,即将重启", icon: "none", position: "bottom", mask: true });setTimeout(() => {plus.runtime.restart(); // 安装完成后重启应用}, 2000);});}}});
}

参考:uniapp开发APP:强制更新和热更新

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

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

相关文章

简述低功耗语音芯片的含义与特点

低功耗语音芯片是一种功耗较低的集成电路,其集成了语音处理、控制逻辑等多个功能。相比传统的语音芯片,低功耗语音芯片能够在功耗较低的情况下完成更多的功能,因此非常适合移动设备和可穿戴设备等对功耗要求较高的场景。 低功耗语音芯片的主要…

《SpringBoot项目实战》第五篇—接口发生异常如何统一处理

系列文章导航 第一篇—接口参数的一些弯弯绕绕 第二篇—接口用户上下文的设计与实现 第三篇—留下用户调用接口的痕迹 第四篇—接口的权限控制 第五篇—接口发生异常如何统一处理 本文参考项目源码地址:summo-springboot-interface-demo 前言 大家好!…

漏洞复现-jquery-picture-cut 任意文件上传_(CVE-2018-9208)

jquery-picture-cut 任意文件上传_(CVE-2018-9208) 漏洞信息 jQuery Picture Cut v1.1以下版本中存在安全漏洞CVE-2018-9208文件上传漏洞 描述 ​ picture cut是一个jquery插件,以友好和简单的方式处理图像,具有基于bootstrap…

V3Det大规模词汇视觉检测数据集与LaRS海上全景障碍物检测数据集

V3Det与LaRS是ICCV2023上发表的数据集工作,规模都比较大,后续有可能会用到,因此记录下来。 V3Det: Vast Vocabulary Visual Detection Dataset Paper: https://arxiv.org/abs/2304.03752 URL: https://v3det.openxlab.org.cn/ 在现实世界中…

出租屋智能视频监控系统方案:全面保卫租客安全

除了我们常见的家庭、社区、园区等智能监控,出租房作为很多人的暂住所也极易发生盗窃等事件,为保障大众租户的财产安全,旭帆科技特地针对出租屋制定了智能监控系统方案。 1、安装智能安防摄像头 高清晰度、夜视功能良好的智能摄像头&#xf…

postgresql 实践

环境搭建 参考:http://www.lvesu.com/blog/main/cms-532.html # 需要安装 postgresql-devel 插件 yum install postgresql-devel* # 安装 pg 和 py 的驱动: # Debian系: apt-get install libpq-dev python-dev # RedHat系: yum install lib…

GSCoolink GSV6127 HDMI 2.0/DisplayPort 1.4到MIPI CSI-2嵌入式MCU混合转换器芯片

Gscoolink GSV6127是一款高性能、低功耗的HDMI 2.0/DisplayPort 1.4到MIPI CSI-2混合转换器。通过集成基于RISC-V的增强型微控制器,GSV6127创造了一种具有成本效益的解决方案,提供了上市时间优势。DisplayPort接收支持高达32.4Gbps(HBR3&…

Java数据类型,变量与运算符

1.字面常量 常量是在程序运行期间,固定不变的量称为常量。 public class HelloWorld{public static void main(String[] args){System.out.println("Hello,world");} } 在以上程序中,输出的Hello Word,其中的“Hello Word”就是…

工业自动化产品抗干扰笔记

工业自动化产品抗干扰笔记 名词解释: 耦合矢量控制寄生振荡热噪点闪变噪点尖峰噪点反电势集肤效应交流电阻感抗容抗寄生电容共模与差模电场和磁场漏电流浪涌电压电流传输与电压传输各种地线解析 一、干扰来源: 任何一个电磁干扰现象都具有电磁干扰源…

前端开发技术栈(工具篇):2023深入了解webpack的安装和使用以及核心概念和启动流程(详细) 63.3k stars

目录 Webpack简介 Entry Module Chunk Loader Plugin Output Webpack的启动流程 Webpack的优缺点 Webpack的使用 1. 安装Webpack 2. 创建Webpack配置文件 3. 编写代码 4. 运行Webpack 5. 在HTML中引入打包后的文件 6. 执行编译命令 Webpack其他功能介绍 1. 使…

[游戏开发][Unity] Xlua生成wrap文件报错、打AB包Wrap报错

Xlua生成wrap文件,自带添加了ref字段报错 例如Material生成MaterialWrap时,EnableKeyword(in LocalKeyword keyword);带着in关键字,所以在Wrap文件中会自动在参数前生成ref关键字导致编译不过 解决办法: 换Xlua版本就好了&#…

单片机为什么一直用C语言,不用其他编程语言?

单片机为什么一直用C语言,不用其他编程语言? 51 单片机规模小得拮据,C 的优势几乎看不到。放个类型信息进去都费劲,你还想用虚函数?还想模板展开?程序轻松破 10k。最近很多小伙伴找我,说想要一些…

大促期间的窜货低价怎么处理

产品窜货往往会伴随低价,所以监测窜货就是要先监测低价,当然有些产品卖价不低价也窜货,但这些正价或者高价卖的链接对渠道影响并不太大,所以治理低价窜货更重要。 力维网络专业为品牌提供窜货治理,低价监测的需求&…

面试必考精华版Leetcode215. 数组中的第K个最大元素

题目&#xff1a; 代码&#xff08;2023年10月27日首刷看解析&#xff09;&#xff1a; class Solution { public:int findKthLargest(vector<int>& nums, int k) {return quickselect(nums,k);}int quickselect(vector<int>& nums,int k){vector<int&…

[UDS] --- WriteDataByIdentifier 0x2E

1 0x2E功能描述 根据ISO14119-1标准中所述&#xff0c;诊断服务2E主要用于Client向Server(ECU)通过DID的方式写入相关的数据。 2 0x2E应用场景 一般而言&#xff0c;对于2E诊断服务&#xff0c;主要应用场景为以下场合&#xff1a; 在整车下线的过程中写入相关配置信息&…

【速看】如何通过合理的封装,让你的自动化脚本更上一层楼!

1. 前言 上一篇推文利用一个在图片范围内实现随机坐标点击的例子&#xff0c;去教会大家如何将自己想要的效果实现出来&#xff0c;受到大家的热情反响&#xff0c;在我们官方讨论群中&#xff0c;还有大佬对我们的示例代码进行优化改进&#xff0c;做了很多合理的函数封装&…

蓝桥杯每日一题2023.10.26

测试次数 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 对于本题我们可以使用动态规划来分析 dp[i][j]代表剩余i层&#xff0c;j台手机的情况下对应的测试数量 分类进行讨论一下&#xff1a; 1.当只剩下一台手机的时候&#xff0c;只能从第一层一层一层往上尝试&#xff0c…

电力变压器经济运行研究

摘要 随着科技的发展&#xff0c;电力已成为最重要的资源之一&#xff0c;如何保证电力的供应对于国民经济发展和人民生活水平的提高都有非常重要的意义。在电能输送过程中&#xff0c;电力变压器是整个过程中最重要的一个基本元素&#xff0c;在电力系统中的输送和分配中被广…

Google单元测试sample分析(一)

本文开始从googletest提供的sample案例分析如何使用单元测试&#xff0c; 代码路径在googletest/googletest/samples/sample1.unittest.cc 本文件主要介绍EXPECT*相关宏使用 EXPECT_EQ 判断是否相等 EXPECT_TRUE 是否为True EXPECT_FALSE 是否为False TEST(FactorialTest, N…

时序预测 | Python实现ARIMA-LSTM自回归移动差分模型结合长短期记忆神经网络时间序列预测

时序预测 | Python实现ARIMA-LSTM自回归移动差分模型结合长短期记忆神经网络时间序列预测 目录 时序预测 | Python实现ARIMA-LSTM自回归移动差分模型结合长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 | Python实现ARIMA-LSTM自…