現在のバージョンと強制アップデートのバージョンを比較して、処理をするということはよくあります。
重大なバグがあった場合に「このバージョン以上は〜する」みたいなときに使うあれです。
/**
* バージョン
*
* @property major メジャーバージョン
* @property minor マイナーバージョン
* @property patch パッチバージョン
*/
class Version(val major: Int, val minor: Int, val patch: Int) : Comparable<Version> {
/**
* コンストラクタ
*/
constructor(major: Int) : this(major, 0, 0)
/**
* コンストラクタ
*/
constructor(major: Int, minor: Int) : this(major, minor, 0)
/**
* バージョン(Int)
*/
private val version = versionOf(major, minor, patch)
/**
* バージョン変換
*
* @param major メジャーバージョン
* @param minor マイナーバージョン
* @param patch パッチバージョン
* @return Int
*/
private fun versionOf(major: Int, minor: Int, patch: Int): Int {
return major.shl(16) + minor.shl(8) + patch
}
override fun toString(): String = "$major.$minor.$patch"
override fun equals(other: Any?): Boolean {
if (this === other) return true
val otherVersion = (other as? Version) ?: return false
return this.version == otherVersion.version
}
override fun hashCode(): Int = version
override fun compareTo(other: Version): Int = version - other.version
companion object {
/**
* 文字列のバージョンから生成
*
* @param version バージョン(String)
* @return [Version]
*/
@Throws(IllegalArgumentException::class, NumberFormatException::class)
fun from(version: String): Version {
val parts = version.split(Regex("\\."))
return when (parts.count()) {
1 -> Version(parts[0].toInt())
2 -> Version(parts[0].toInt(), parts[1].toInt())
3 -> Version(parts[0].toInt(), parts[1].toInt(), parts[2].toInt())
else -> throw IllegalArgumentException("This is invalid version format. $version")
}
}
}
}
使う側
if (BuildConfig.VERSION_NAME < Version("1.1.0")) {
// 強制アップデート表示
}
おまけ
こんなけバージョン比較方法を紹介しといてあれなんですが
最近は in-app-updates という機能が追加されました。
ただこれはアプリ内で、アップデートを促進するための機能です。
アップデート画面を閉じることができるので 強制アップデートではないです。