🍏

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

2022/04/26に公開

概要

アプリでバージョンアップの処理の中で、
1.0.1などの文字列のバージョン比較が必要な場面での参考に。
参考記事は↓↓こちらです。
https://qiita.com/inoue2355/items/4b1907ca52eff76bd498

実装

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

比較処理

class ComparableVersion(version: String) : Comparable<ComparableVersion> {
    private var parts: List<String>

    init {
        if (!version.matches(Regex("[0-9]+(\\.[0-9]+)+"))) {
            throw IllegalAccessException("Invalid version format")
        }
        this.parts = version.split(Regex("\\."))
    }

    override fun compareTo(other: ComparableVersion): Int {
        val length = this.parts.size.coerceAtLeast(other.parts.size)
        for (i in 0 until length) {
            val thisPart = if (i < this.parts.size) this.parts[i].toInt() else 0
            val otherPart = if (i < other.parts.size) other.parts[i].toInt() else 0

            if (thisPart < otherPart) {
                return -1
            }
            if (thisPart > otherPart) {
                return 1
            }
        }
        return 0
    }

    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (other == null) return false
        if (this::class.java.name != other::class.java.name) {
            return false
        }
        return this.compareTo(other as ComparableVersion) == 0
    }
}

使用例

val updateVersion = ComparableVersion("2.0.0")
val currentVersion = ComparableVersion(BuildConfig.VERSION_NAME)
if (updateVersion.compareTo(currentVersion) == 0) {
  // アップデートバージョンと現バージョンが同じ場合
}

iOSの場合

https://zenn.dev/chiii/articles/0d2cf2d9cd0556

Discussion