🍎

[Swift]アプリのバージョン比較処理

2022/04/26に公開

概要

アプリでバージョンアップの処理の中で、
1.0.1などの文字列のバージョン比較が必要な場面での参考に。

実装

前提条件として、
文字列の1.0.1など他の型では扱えない場合を考慮する。

比較処理

extension String {
    func versionCompare(_ otherVersion: String) -> ComparisonResult {
        let delimiter = "."
        var versionComponents = self.components(separatedBy: delimiter)
        var otherComponents = otherVersion.components(separatedBy: delimiter)

        let zeroDiff = versionComponents.count - otherComponents.count

        if zeroDiff == 0 {
            // 同じフォーマットなので、通常通りに比較
            return self.compare(otherVersion, options: .numeric)
        } else {
            // 異なるフォーマットの場合末尾に0を追加
            let zero = Array(repeating: "0", count: abs(zeroDiff))
            if zeroDiff > 0 {
                otherComponents.append(contentsOf: zero)
            } else {
                versionComponents.append(contentsOf: zero)
            }
            return versionComponents.joined(separator: delimiter)
                .compare(otherComponents.joined(separator: delimiter), options: .numeric)
        }
    }
}

使用例

let currentVersion = Bundle.main.versionCode
let updateVersion = "1.0.1"
// アップデートバージョンの方が上の場合true
let needUpdate = updateVersion.versionCompare(currentVersion) == .orderedDescending
if needUpdate {
   // アップデートが必要
}

Androidの場合

https://zenn.dev/chiii/articles/9c344ad26d15c5

Discussion