//在開發中,經常會遇到有些需求需要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,需要強更 }