我想在App Store上更新我的应用程序。当更新后首次打开应用程序时,我希望它同步一些内容。因此,我需要一种方法来查看它是否是更新后的首次启动。
我想到的解决方案是:将应用程序版本存储在NSUserDefaults
中,如下所示:
NSString *oldVersion = [[NSUserDefaults standardUserDefaults] objectForKey:@"appVersion"];
NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
[[NSUserDefaults standardUserDefaults] setObject:currentVersion forKey:@"appVersion"];
[[NSUserDefaults standardUserDefaults] synchronize];
现在我有了oldVersion
和currentVersion
,我需要做的就是比较它们。我想知道oldVersion
是否比currentVersion
小.但它们是字符串。如何检查是否oldVersion < currentVersion
?
我知道我可以检查它们是否不平等。但我想为未来的更新做好准备。因为也许我想为这个 2 执行的同步对于版本 3 会有所不同,依此类推。
您可以使用自然排序顺序(与词典排序顺序不同,这会将 1.10 视为在 1.1 之后(来比较数字版本号,如下所示:
BOOL isNewer = ([currentVersion compare:oldVersion options:NSNumericSearch] == NSOrderedDescending)
Swift 4
if cuurentVersionString.compare(forceUpdate, options: .numeric) == .orderedAscending {
print("force")
state = .force
}
这意味着强制更新版本高于当前版本
Swift 3.0 中的代码作为字符串扩展,适用于包含额外零的版本。例如:1.0.0
& 1.0
(
''
/// Inner comparison utility to handle same versions with different length. (Ex: 1.0.0 & 1.0)
private func compare(toVersion targetVersion: String) -> ComparisonResult {
let versionDelimiter = "."
var result: ComparisonResult = .orderedSame
var versionComponents = components(separatedBy: versionDelimiter)
var targetComponents = targetVersion.components(separatedBy: versionDelimiter)
let spareCount = versionComponents.count - targetComponents.count
if spareCount == 0 {
result = compare(targetVersion, options: .numeric)
} else {
let spareZeros = repeatElement("0", count: abs(spareCount))
if spareCount > 0 {
targetComponents.append(contentsOf: spareZeros)
} else {
versionComponents.append(contentsOf: spareZeros)
}
result = versionComponents.joined(separator: versionDelimiter)
.compare(targetComponents.joined(separator: versionDelimiter), options: .numeric)
}
return result
}
public func isVersion(equalTo targetVersion: String) -> Bool { return compare(toVersion: targetVersion) == .orderedSame }
public func isVersion(greaterThan targetVersion: String) -> Bool { return compare(toVersion: targetVersion) == .orderedDescending }
public func isVersion(greaterThanOrEqualTo targetVersion: String) -> Bool { return compare(toVersion: targetVersion) != .orderedAscending }
public func isVersion(lessThan targetVersion: String) -> Bool { return compare(toVersion: targetVersion) == .orderedAscending }
public func isVersion(lessThanOrEqualTo targetVersion: String) -> Bool { return compare(toVersion: targetVersion) != .orderedDescending }
'''