状況
今回は、アプリのバージョン文字列の大小を比較します。バージョン文字列は"1.2.3"
などのような、文字列を単純に数値に変換することができません。
しかし、アプリの強制アップデート等の対策をする際には、必要とされるバージョンを示す文字列と、現在インストールされているアプリのバージョンを示す文字列を比較する必要があります。
[iOS]アプリに強制アップデート機能を導入すべき理由と、簡単に実装する方法
上記の実装だと下記の場合に正しく動作しません。今回の要件的に下記の場合に正しく動作しないのはよろしくありませんでした。
let required = "1.10.0"
let current = "1.2.0"
// required > current のはずなのに required < currentと判断されてします
コード
そこで、正しく動作しそうな関数を作ってみました。
/// required > currentの場合にtrueを返す関数
func isUpdateRequired(_ requiredVersion: String) -> Bool {
let currentVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as! String
// Intの配列に変換
var required = requiredVersion.components(separatedBy: ".").map{ Int($0) ?? 0 }
var current = currentVersion.components(separatedBy: ".").map{ Int($0) ?? 0 }
// 配列の長さの統一
let diff = required.count - current.count
let padding = Array(repeating: 0, count: abs(diff))
if diff > 0 {
current.append(contentsOf: padding)
} else if diff < 0 {
required.append(contentsOf: padding)
}
// 各インデックスの値を比較
for (r, c) in zip(required, current) {
if r > c {
return true
} else if r < c {
return false
}
}
return false
}
isUpdateRequired("1.10.0") // true or false
それほどしっかりと動作は試せていませんが、.
で数値が区切られているものであれば正しく動作しそうです。もう少し良い書き方があればアドバイスください。
おわり。