iOS: comparación de las versiones de la aplicación

Quiero actualizar mi aplicación en App Store. Cuando la aplicación se abre por primera vez después de la actualización, quiero que sincronice algunas cosas. Por lo tanto, necesito una forma de ver si es el primer lanzamiento después de la actualización.

La solución en la que pensé es: almacenar la versión de la aplicación en NSUserDefaults así:

 NSString *oldVersion = [[NSUserDefaults standardUserDefaults] objectForKey:@"appVersion"]; NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]; [[NSUserDefaults standardUserDefaults] setObject:currentVersion forKey:@"appVersion"]; [[NSUserDefaults standardUserDefaults] synchronize]; 

ahora tengo la oldVersion y la currentVersion y todo lo que tengo que hacer es compararlos. Quiero saber si la oldVersion es más pequeña que la currentVersion . Pero son cadenas. ¿Cómo puedo comprobar si oldVersion < currentVersion ?

Sé que puedo comprobar si no son iguales. Pero quiero estar preparado para futuras actualizaciones. Porque tal vez la synchronization que quiero realizar para este 2 será diferente para la versión 3 y así sucesivamente.

Puede comparar los numbers de versión numérica utilizando el order de sorting natural (que considerará 1.10 para después de 1.1, a diferencia del order de sorting lexicográfica) de la siguiente manera:

 BOOL isNewer = ([currentVersion compare:oldVersion options:NSNumericSearch] == NSOrdenetworkingDescending) 

Código en Swift 3.0 como extensión de cadena, que funciona con versiones que contienen ceros adicionales. (Ej: 1.0.0 y 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 = .ordenetworkingSame 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) == .ordenetworkingSame } public func isVersion(greaterThan targetVersion: String) -> Bool { return compare(toVersion: targetVersion) == .ordenetworkingDescending } public func isVersion(greaterThanOrEqualTo targetVersion: String) -> Bool { return compare(toVersion: targetVersion) != .ordenetworkingAscending } public func isVersion(lessThan targetVersion: String) -> Bool { return compare(toVersion: targetVersion) == .ordenetworkingAscending } public func isVersion(lessThanOrEqualTo targetVersion: String) -> Bool { return compare(toVersion: targetVersion) != .ordenetworkingDescending } 

“ `