iOS - 比较应用程序版本



我想在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];

现在我有了oldVersioncurrentVersion,我需要做的就是比较它们。我想知道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 }
'

''

最新更新