就话不多说,上代码就好
//保存商店 app 版本,待用
class func saveStoreAppVersion(version: String) {
UserDefaults.standard.setValue(version, forKey: APP_ID)
}
//获取商店 app 版本
class func getStoreAppVersion() -> String {
UserDefaults.standard.value(forKey: APP_ID) as? String ?? ""
}
//获取本地 app 的版本
class func getLocalAppVersion() -> String {
Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? ""
}
//定义一个静态变量,记录是否正在审核的状态,防止每次调用都计算版本号
private static var REVIEW_FLAG: Bool?
// 判断是否在审核中:将本地版本 和 商店版本号,
// 通过 . 拆分成数字数组,依次比较大小,如果本地版本号大,表示在审核中
class func isReviewing() -> Bool {
//该字段是一个全局变量,记录了是否正在审核的状态,
//防止每次进入后面的计算版本号的代码,提高方法调用的效率
if REVIEW_FLAG != nil {
//print("REVIEW_FLAG: \(REVIEW_FLAG!)") //打日志太多 去掉了
return REVIEW_FLAG!
}
//商店版本
let storeVersion = getStoreAppVersion()
//如果商店中 App 的版本为空,表示新 app 还没有上架,认为在审核中
if storeVersion.isEmpty {
print("商店版本号为空,认为还未上架,审核中,REVIEW_FLAG: true")
//记录到全局状态
REVIEW_FLAG = true
return true
}
//本地版本
let localVersion = getLocalAppVersion()
print("storeVersion: \(storeVersion) ; lovalVersion: \(localVersion)")
//判断是否相等,相等的话,表示非审核中
if storeVersion == localVersion {
print("版本相同,非审核中,REVIEW_FLAG : false")
//记录到全局状态
REVIEW_FLAG = false
return false
}
//本地与商店版本不相等,需要比较才能确定
//根据 . 拆分字符串为数组 [Substring],
//如 "1.0.0" -> ["1", "0", "0"] ; "1.0.1" -> ["1", "0", "1"]
var storeArr = storeVersion.split(separator: ".")
var localArr = localVersion.split(separator: ".")
//拆分后的数组长度,有可能会出现不一致,比如本地版本 "1.0.0" 线上版本 "1.0.0.1"
let storeCount = storeArr.count
let localCount = localArr.count
print("storeArrCount: \(storeCount) appArrCount:\(localCount)")
//处理版本数组长度不同的问题,补齐用的数组,默认用 0 补齐
let tmpArr = [Substring](repeating: "0", count: abs(storeCount - localCount))
print("tmpArr: \(tmpArr)")
//补齐数组长度,防止越界的发生
if storeCount < localCount {
//补齐商店拆分后的数组
storeArr.append(contentsOf: tmpArr)
}else if localCount < storeCount {
//补齐本地 app 的数组
localArr.append(contentsOf: tmpArr)
}
//打印补齐后的数组
print("storeArr:\(storeArr) localArr:\(localArr)")
//依次比较数组中的数字
var isReviewing = false
for index in 0 ..< storeArr.count {
// 转为 Int,如果本地版本号大,表示在审核中
if Int(localArr[index]) ?? 0 > Int(storeArr[index]) ?? 0 {
isReviewing = true
break
}
}
//记录到全局状态
REVIEW_FLAG = isReviewing
print("是否为审核版本 REVIEW_FLAG : \(isReviewing)")
return isReviewing
}