uni-app整包更新与热更新方案(安卓和IOS)

news2024/10/6 18:35:27

原文链接:uni-app整包更新与热更新方案(安卓和IOS)

效果预览

图1
图2
图3
图4
图5

大致效果:

打开App,进入首页(首次),检测线上是否存在新版本,如果存在,弹窗提示用户是否进行版本更新。Android 有热更新整包更新,若为热更新,更新完会自动重启;若为整包更新,则进入浏览器(如果上架了应用市场,对应逻辑可以写成跳转到应用市场)进行下载。ios 则只能跳转到App Store进行更新。

如果用户点了取消按钮,在使用 App 的过程中不会再进行弹窗提示,等到用户下次进入 App 才会重新提示。

步骤

客户端版本管理


字段解释
更新包名称更新包名称,例如:HK-IOS-1.0.0
更新包文件上传的 apk、ipa、wgt 文件
更新包版本号更新包版本号,必须大于上一次更新的版本号
客户群体1 普通用户 、 2 会员
更新包类型ANDROID 、 IOS
更新类型否 、 整包更新 、 热更新
发行地区港澳台 、 印尼 、 大陆
更新包描述zh(中文) 、 en(英文) 、 in(印尼语)

这里的字段可根据自己的需求进行设计。

APP

version 组件

<template>
	<view class="tzy-version">
		<u-modal 
            :value="updateVsb"
            :title="$t('version.versionUpdateTips')"
            :show-cancel-button="isShowCancelBtn"
            :cancel-text="$t('btn.cancel')"
            :confirm-text="$t('version.update')"
            @cancel="cancelUpdate"
            @confirm="updateConfirm">
            <view class="version-online">V {{ updateObj.version }}</view>
            <view class="model-version" slot-name="content">
                <scroll-view scroll-y="true" class="content-text">
                    <view class="content-text">
                        <u-input  
                            v-model="targetDesc" 
                            type="textarea" 
                            :border="false"
                            :disabled="true" 
                            :auto-height="true"
                            :customStyle="{ 'font-size': '14px', color: '#96a0b5',
                            'word-break': 'break-word !important' }"
                        />
                    </view>
                </scroll-view>
            </view>
        </u-modal>
    </view>
</template>
<script>
import config from '@/common/js/config.js';
import phoneInfo from '@/common/js/phone-info.js';
export default {
    props: {
        // 页面来源
        pageFrom: {
            type: String,
            default: 'Home'
        },
        // 是否显示弹窗
        updateVsb: {
            type: Boolean,
            default: false
        },
        // 是否显示取消按钮
        isShowCancelBtn: {
            type: Boolean,
            default: true
        },
        updateObj: {
            type: Object,
            default: () => {}
        },
        targetDesc: {
            type: String,
            default: ''
        }
    },
    methods: {
        cancelUpdate() {
            if (this.pageFrom == 'Home') {
                uni.setStorageSync('cancelUpdate', 'true');
            }
            this.$emit('cancelClickEvent');
        },
        updateConfirm() {
            // 下载更新包
            const platform = phoneInfo.systemInfo.platform.toLowerCase();
            const url = config.uploadUrl + this.updateObj.url;
            const type = this.updateObj.type;
            // type仅为我司定义
            if (type == 1) {
                this.$emit('cancelClickEvent');
                uni.setStorageSync('cancelUpdate', 'true');
                uni.setStorageSync('widgetInfo', {});
                // 整包
                if (platform == 'android') {
                    // 安卓打开网页下载
                    plus.runtime.openURL(url);
                } else {
                    // ios打开应用商店 https://appstoreconnect.apple.com/
                    // apple id  在 app conection 上传的位置可以看到  
                    const appleId = 'xxxxxx'; // 这里替换成你的 apple id
                    plus.runtime.launchApplication({
                            action: `itms-apps://itunes.apple.com/cn/app/id${appleId}?mt=8`
                        },
                        function(e) {
                            console.log('Open system default browser failed: ' + e.message);
                        }
                    );
                }
            } else if (type == 2) {
                //热更新
                console.log('热更新。。。。。。。。', url);
                plus.nativeUI.showWaiting(this.$t('dataDesc.updating'));
                uni.downloadFile({
                    url: url,
                    success: downloadResult => {
                        if (downloadResult.statusCode === 200) {
                            plus.runtime.install(
                                downloadResult.tempFilePath, {
                                    force: false
                                },
                                function() {
                                    console.log('install success...');
                                    plus.nativeUI.closeWaiting();
                                    // 更新版本信息
                                    uni.setStorageSync('widgetInfo', {});
                                    plus.runtime.restart();
                                },
                                function(e) {
                                    console.error('install fail...');
                                    plus.nativeUI.closeWaiting();
                                }
                            );
                        }
                    },
                    fail: error => {
                        console.log(error);
                    }
                });
            }
        }
    }
};
</script>
<style lang="scss" scoped>
	.version-online {
		text-align: center;
		font-size: 14px;
		font-weight: 600;
		margin-top: 10px;
	}

	.content-text {
		max-height: 280px;
	}

	.model-version {
		padding: 12px 24px 30px;
		font-size: 14px;
		color: $cat_text_normal;
	}

	.desc-font {
		font-size: 14px !important;
		color: #96a0b5 !important;
		word-break: break-all !important;
	}
</style>

首页中引用 version 组件

<template>
	<view>
		<!-- 热更新组件 仅APP显示-->
        <!-- #ifdef APP-PLUS -->
        <versionUpdate 
            pageFrom="Home" 
            :updateVsb="updateVsb" 
            :updateObj="updateObj" 
            :targetDesc="targetDesc"
            @cancelClickEvent="cancelClickEvent">
        </versionUpdate>
        <!-- #endif -->
    </view>
</template>
<script>
    import { clientVersionQuery } from '@/api/client.js';
    import versionUpdate from '@/components/muudah-version/index.vue';
    export default {
        name: 'Home',
        components: {
            versionUpdate
        },
        data() {
            return {
                updateObj: {
                    url: '',
                    type: '',
                    version: ''
                },
                updateVsb: false,
                targetDesc: '', // 版本更新描述
            };
        },
        methods: {
            getUpdate() {
                //当前版本号 转化为数字
                const tar_version = versionToNum(phoneInfo.manifestInfo.version);
                // android || ios
                const platform = phoneInfo.systemInfo.platform.toLowerCase() == 'ios' ? 'IOS' : 'ANDROID';
                const version_to = this.versionTo; // 发行地区
                // 这里调接口 是否检测到版本更新
                clientVersion({
                    client_type: platform,
                    client_area: version_to
                }).then(res => {
                    const {
                        Code,
                        data,
                        sdk_path
                    } = res;
                    if (Code == 0 && sdk_path != '' && data.client_version != '') {
                        // 线上的版本 转化为数字
                        const versin_online = versionToNum(data.client_version);
                        if (versin_online > tar_version && data.update_status > 0) {
                            this.updateObj.url = sdk_path;
                            this.updateObj.type = data.update_status;
                            this.updateObj.version = data.client_version;
                            // "update_status": 更新类型. 0: 否, 1: 整包更新, 2: 热更新
                            const desc_str = eval('(' + data.desc + ')');
                            // 这里根据语言包显示语言
                            this.targetDesc = desc_str[this.language]; 
                            this.updateVsb = true;
                        }
                    }
                });
            },
            cancelClickEvent() {
                this.updateVsb = false;
            }
        }
    }
</script>

APP.vue

<script>
    import phoneInfo from '@/common/js/phone-info.js'; // 这里面保存了 设备的基本信息
    export default {
        onLaunch: function() {
            // 获取设备基本信息
            uni.getSystemInfo({
                success: res => {
                    phoneInfo.systemInfo = res;
                }
            });
            // #ifdef APP-PLUS
            plus.screen.lockOrientation('portrait-primary'); //锁定屏幕方向
            uni.setStorageSync('cancelUpdate', 'false'); // 进来APP 重置更新弹窗
            // 获取App 当前版本号
            if (Object.keys(uni.getStorageSync('widgetInfo')).length == 0) {
                plus.runtime.getProperty(plus.runtime.appid, widgetInfo => {
                    phoneInfo.manifestInfo = widgetInfo;
                    uni.setStorageSync('widgetInfo', widgetInfo);
                });
            }
            //#endif
        }
    };
</script>

最后,你还可以尝试了解 App升级中心 uni-upgrade-center 。

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

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

相关文章

VMware17虚拟机安装及Linux系统搭建(详细版)

✅作者简介&#xff1a;大家好&#xff0c;我是小杨 &#x1f4c3;个人主页&#xff1a;「小杨」的csdn博客 &#x1f433;希望大家多多支持&#x1f970;一起进步呀&#xff01; &#x1f4dc;前言&#xff1a; VMware是一个虚拟PC的软件&#xff0c;可以在现有的操作系统上虚…

虚拟机最小化方式安装Centos7后,ping和ifconfig都不可用解决方法

我用的是台式机&#xff0c;主机连接的是网线&#xff0c;在以最小化方式安装Centos7后&#xff0c;ping和ifconfig不可用。这里要记住&#xff0c;vm虚拟机使用网络适配器是&#xff1a;NAT 模式(N): 用于共享主机的 IP 地址 问题&#xff1a; ifconfig command not found p…

QT基本组件与常用类

目录 一、设计师 Designer&#xff08;掌握&#xff09; 二、布局 Layout 2.1 布局的基本使用&#xff08;掌握&#xff09; 2.2 布局属性&#xff08;掌握&#xff09; 2.3 伸展器&#xff08;掌握&#xff09; 2.4 嵌套&#xff08;掌握&#xff09; 2.5 伸展与策略&#xff…

【C语言进阶】想用好C++?那就一定要掌握动态内存管理

目录 &#x1f929;前言&#x1f929;&#xff1a; 一、动态内存概述⚔️&#xff1a; 1.什么是动态内存&#xff1a; 2.动态内存分配的意义&#xff1a; 二、常用的动态内存函数&#x1f3f9;&#xff1a; 1. malloc 和 free函数&#xff1a; ①. malloc 函数&#xff1a; …

基于PSO粒子群优化的带时间窗VRPTW问题matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation)&#xff0c;1995 年由Eberhart 博士和kennedy 博士提出&#xff0c;源于对鸟群捕食的行为研究 。该算法最初是受到飞鸟集群活…

数据结构初阶:树与二叉树(1)——堆

许久没发博客&#xff0c;在这里跟各位看客道声久等了~ 冬至已至&#xff0c;各位有没有吃上热乎的饺子呢 下面给各位奉上承载着满满干货的饺子吧&#xff1a; 目录 一、树 1. 树的结构定义 2. 树的相关概念 3. 树的表示 孩子兄弟表示法 二、二叉树 1. 二叉树的结构定义 2. 特…

自己整理的vue实现生成分享海报(含二维码),看着网上的没实现

大家好&#xff0c;我是雄雄。 前言 相信大家在许多的场景下&#xff0c;看到过这样的案例。 当我们在某购物app上看好一件商品&#xff0c;想分享给别人时&#xff0c;app会给我们生成一张海报&#xff0c;我们将其保存在手机里面转发给其他人达到分享。当我们逛CSDN的时候&…

【Android弹窗】Dialog Bottom Translate Animation

文章目录1. 系统Dialog2. 自定义Dialog3. 其余1. 系统Dialog 首先先来使用回顾一下系统的Dialog弹窗&#xff0c;这里使用比较简单的AlertDialog为例&#xff1a; AlertDialog.Builder builder new AlertDialog.Builder(this).setTitle("弹窗标题").setMessage(&q…

【小程序】全局数据共享

目录 全局数据共享 1. 什么是全局数据共享 2. 小程序中的全局数据共享方案 全局数据共享 - MobX 1. 安装 MobX 相关的包 2. 创建 MobX 的 Store 实例 3. 将 Store 中的成员绑定到页面中 4. 在页面上使用 Store 中的成员 ​5. 将 Store 中的成员绑定到组件中 6. 在组件中…

【分布式技术专题】「架构实践于案例分析」盘点一下分布式模式下的服务治理和监控优化方案

什么是服务治理&#xff1f; 相信每一个软件公司&#xff08;企业&#xff09;都希望可以确保开发及项目运行流程可以顺利&#xff0c;但是如果要完美完结那么需要其中会有很多的因素存在。包括&#xff0c;最佳实践、架构原则、服务治理以及其他决定性的因素。而其中服务治理…

新冠确诊阳性的第七篇博客,Linux动态监控系统

新冠确诊阳性的第七篇博客&#xff0c;Linux动态监控系统1.动态监控进程2.动态监控网络1.动态监控进程 top命令和ps相似&#xff0c;都可以用来显示系统正在执行的进程&#xff0c;top和ps的最大不同之处就是在于top在执行一段时间可以更新正在运行的进程&#xff08;也可以理…

JavaScript:优先级队列的实现案例

优先级队列的定义&#xff1a;优先级队列&#xff08;priority_queue&#xff09;其实&#xff0c;不满足先进先出的条件&#xff0c;更像是数据类型中的“堆”。优先级队列每次出队的元素是队列中优先级最高的那个元素&#xff0c;而不是队首的元素。这个优先级可以通过元素的…

架构设计(九):估算

架构设计&#xff08;九&#xff09;&#xff1a;估算 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;架构设计&#xff08;九&#xff09;&#xff1a;估算 CSDN&#xff1a;架构设计&#xff08;九&#xff09;&#xff1a;估算 估算在系统设计中非常重…

还在用定时器吗?借助 CSS 来监听事件

平时工作中很多场合都要用到定时器,比如延迟加载、定时查询等等,但定时器的控制有时候会有些许麻烦,比如鼠标移入停止、移出再重新开始。这次介绍几个借助 CSS 来更好的控制定时器的方法,一起了解一下吧,相信可以带来不一样的体验 一、hover 延时触发 有这样一个场景,在…

C++ WebSockSet服务器解决方案

使用C实现WebSocket服务器是为了解决Web直接访问本地应用程序最佳解决方案。解决云访问硬件最经济的方案或增加了一种解决方法。方案选用开源uWebSockets库。 开发工具选择Visual C 2017,所有源码或工程都用它编译或创建。 1. 准备工作 下载以下第三方库最新版源码并且编译供…

FMOC-PEG-COOH,FMOC-PEG-acid,芴甲氧羰基-聚乙二醇-羧基试剂供应

英文名称&#xff1a;FMOC-PEG-COOH&#xff0c;FMOC-PEG-acid 中文名称&#xff1a;芴甲氧羰基-聚乙二醇-羧基 蛋白质、肽和其他材料通过氨基酸或其他酸活性化学组&#xff0c;增加溶解度和稳定性&#xff0c;降低免疫原性&#xff1b;药物修饰或缓释药物研发&#xff0c;新…

复旦MBA第二学位:畅享顶尖国际商科资源,探索全球发展新可能

自2009年以来&#xff0c;复旦MBA项目一直致力于与顶级院校开展合作&#xff0c;拓宽学生的国际视野。目前&#xff0c;复旦MBA项目与三所国际顶尖合作院校达成了第二学位项目的合作&#xff1a;美国麻省理工学院斯隆管理学院管理学硕士学位(Master of Science in Management S…

【OpenCV-Python】教程:7-7 PCA

OpenCV Python PCA 【目标】 利用 pca 来计算目标的方向 【理论】 Introduction to Principal Component Analysis (PCA) PCA&#xff08;主成分分析&#xff09;是提取最重要特征的统计过程。 假设你有一组2D点&#xff0c;如上图所示。每个维度都对应于您感兴趣的特性。…

Blender——苹果的材质绘制

效果图 前言 在进行纹材质的绘制之前&#xff0c;首先要具有苹果的三维模型和进行苹果纹理绘制。 关于苹果的建模请参考&#xff1a;Blender——“苹果”建模_行秋的博客 关于苹果的纹理绘制请参考&#xff1a;Blender——苹果纹理绘制_行秋的博客 书接上回&#xff0c;由Te…

FMOC-PEG-acid,FMOC-PEG-COOH,芴甲氧羰基PEG羧基用于探究新型材料

用于探究新型材料的化学试剂芴甲氧羰基-聚乙二醇-羧基&#xff0c; 其英文名为FMOC-PEG-acid&#xff08;FMOC-PEG-COOH&#xff09;&#xff0c;它所属分类为Boc/Fmoc protected amine PEG Carboxylic acid PEG。 芴甲氧羰基peg羧基试剂的分子量均可定制&#xff0c;有&#…