• App强更逻辑实现以及版本号如何判断大小


    //在开发中,经常会遇到有些需求需要app强更,思路大概:所有请求都要带上版本号和渠道(android或ios),然后网关对这些版本号判断,如果发现这些版本号是很旧的,就返回错误码或者标志符告诉app,app做对应的逻辑,如提示用户点击更新之类的

    首先在application.yml里配置是否需要强制更新以及当前系统的最新版本:

    之后根据请求参数带过来的版本号进行判断,具体逻辑如下:

    //读取配置文件
    @Configuration
    public class AppConfig {
        @Value("${android_last_version}")
        private String androidLastVersion;
        @Value("${android_force_update}")
        private String androidForceUpdate;
        @Value("${ios_last_version}")
        private String iosLastVersion;
        @Value("${ios_force_update}")
        private String iosForceUpdate;
    
        public String getAndroidLastVersion() {
            return androidLastVersion;
        }
    
        public void setAndroidLastVersion(String androidLastVersion) {
            this.androidLastVersion = androidLastVersion;
        }
    
        public String getAndroidForceUpdate() {
            return androidForceUpdate;
        }
    
        public void setAndroidForceUpdate(String androidForceUpdate) {
            this.androidForceUpdate = androidForceUpdate;
        }
    
        public String getIosLastVersion() {
            return iosLastVersion;
        }
    
        public void setIosLastVersion(String iosLastVersion) {
            this.iosLastVersion = iosLastVersion;
        }
    
        public String getIosForceUpdate() {
            return iosForceUpdate;
        }
    
        public void setIosForceUpdate(String iosForceUpdate) {
            this.iosForceUpdate = iosForceUpdate;
        }
    }
    校验逻辑:
    package com.example.demo.config;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.util.StringUtils;
    @Service
    public  class CheckVersionService {
        @Autowired
        private AppConfig app;
    
        /**
         *
         * @param version 版本号,如2.1.0
         * @param chanel 渠道: android 或者ios
         * @return true代表需要强更,在网关对所有请求拦截,发现需要强更时,返回true给app,然后app开发者对结果进行处理,如用户
         * 登录app,就弹窗"由于您当前的版本过低,需要更新才能使用",该弹框没法关闭,用户只能更新app
         */
        public  boolean checkVersion(String version,String chanel){
            //判断android是否需要强更
            if("android".equals(chanel)&& "y".equals(app.getAndroidForceUpdate())){
                if(compareVersion(app.getAndroidLastVersion(),version)>0){
                    return true;//需要强更
                }
    
            }
            //判断ios是否需要强更
            if("ios".equals(chanel)&& "y".equals(app.getIosForceUpdate())){
                if(this.compareVersion(app.getIosLastVersion(),version)>0){
                    return true;//需要强更
                }
    
            }
    
            return false;
        }
    
        /**
         * 比较2个版本号的大小,按位比较,先比较第一位,第一位相等再比较第二位
         * @param v1 如 2.1.0
         * @param v2 如 3.1.1
         * @return
         */
        public int compareVersion(String v1,String v2){
            if(StringUtils.isEmpty(v1) && StringUtils.isEmpty(v2)){
                return 0;
            }
            if(StringUtils.isEmpty(v1)){
                return -1;
            }
            if(StringUtils.isEmpty(v2)){
                return 1;
            }
            String[] arrV1 = v1.split("\.");
            String[] arrV2 = v2.split("\.");
            int min = Math.min(arrV1.length, arrV2.length);
    
            for (int i = 0; i < min; i++) {
                return Integer.valueOf(arrV1[i])>Integer.valueOf(arrV2[i])?1:-1;
    
            }
            if(arrV1.length==arrV2.length){
                return 0;
            }
    
            if(arrV1.length>arrV2.length){
                return -1;
            }
            return 1;
    
        }
    }
    测试:
      @Test
        public void checkversion() throws IOException {
            //配置里最新安卓的版本是2.1.0
            System.out.println(checkVersionService.checkVersion("2.1.2", "android"));//false,不需要强更
            //配置里最新ios的版本是2.1.0
            System.out.println(checkVersionService.checkVersion("1.1.2", "ios"));//true,需要强更
    
        }
    
  • 相关阅读:
    C#中静态与非静态方法比较
    Hibernate学习之路-- -映射 继承关系(subclass , joined-subclass,union-subclass )
    网络协议概述:物理层、连接层、网络层、传输层、应用层详解
    phpstorm xdebug配置
    eclipse修改内存大小
    Session机制详解
    java把html标签字符转普通字符(反转换成html标签)(摘抄)
    JAVA调用WCF
    RabbitMQ入门与使用篇
    大话程序猿眼里的高并发
  • 原文地址:https://www.cnblogs.com/yangxiaohui227/p/11194544.html
Copyright © 2020-2023  润新知