项目需求:
- 基于远程控制iOS版本的强弱更新,后端在请求更新状态的接口里仅会返回应用市场的最新版本号,原生需要将应用市场的最新版版本号与本地版本号作比较,如果本地版本号小于应用市场最新版本号,则提示更新;反之,则正常使用。
思路
- 分别获取服务端接口返回与本地的版本号,如:服务端接口返回版本号为1.1.0;本地版本号为1.0.0.
- 将二者去掉小数点之后,分为两个由数字组成的数组,如:服务端数组[1,1,0];本地版本数组[100],逐个比较每位元素的大小。
实现
1、获取本地版本号:
// 获取本地版本号:
let localVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String ?? ""
// 因为key值较长,这里我抽成一个方法:let localVersion = BasicTool.getAppVersion()
public struct BasicTool {
//获取app版本号
public static func getAppVersion() -> String{
return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String ?? ""
}
}
2、具体比较逻辑,直接贴代码:
// 版本管理类
class VersionManager {
// 返回版本比较结果,如果"localVersion >= appStoreVersion",则返回false,不更新;如果"localVersion < appStoreVersion",则返回true,提示更新。
class func versionCompare(_ appStoreVersion: String) -> Bool {
let localVersion = BasicTool.getAppVersion()
//判断合法性
if checkSeparat(localVersion) == "" || checkSeparat(appStoreVersion) == "" {
return false
}
//获得两个数组
let localVersionArr = cutUpNumber(localVersion)
let appStoreVersionArr = cutUpNumber(appStoreVersion)
//比较版本号
return compareNumber(with: localVersionArr, appStoreVersionArr: appStoreVersionArr)
}
//提取连接符
class func checkSeparat(_ vString:String) -> String {
var separated:String = ""
if vString.contains("."){ separated = "." }
if vString.contains("-"){ separated = "-" }
if vString.contains("/"){ separated = "/" }
if vString.contains("*"){ separated = "*" }
if vString.contains("_"){ separated = "_" }
return separated
}
//提取版本号
class func cutUpNumber(_ vString:String) -> Array<String> {
let separat = checkSeparat(vString)
let b = NSCharacterSet(charactersIn:separat) as CharacterSet
let vStringArr = vString.components(separatedBy: b)
return vStringArr
}
//比较版本
class func compareNumber(with localVersionArr: [String], appStoreVersionArr: [String]) -> Bool {
for i in 0..<localVersionArr.count {
if appStoreVersionArr.count <= i {
return false
}
if localVersionArr[i].integerValue != appStoreVersionArr[i].integerValue {
if localVersionArr[i].integerValue > appStoreVersionArr[i].integerValue {
return false
}else{
return true
}
}
}
return false
}
}
3、场景调用:
// 开启更新之后,市场版本号与本地号比较大小,市场版本号>本地版本号,则提示更新;市场版本号<=本地版本号,则不提示;
// 其中model.dictItemCode为接收到后端接口返回的市场最新版本号
if VersionManager.versionCompare(model.dictItemCode) {
// 更新逻辑
}
4、如此,问题解决,谢谢!