1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Androidの強制アップデートでよく使うアプリバージョン比較方法

Last updated at Posted at 2020-02-07

現在のバージョンと強制アップデートのバージョンを比較して、処理をするということはよくあります。
重大なバグがあった場合に「このバージョン以上は〜する」みたいなときに使うあれです。

/**
 * バージョン
 *
 * @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 という機能が追加されました。

ただこれはアプリ内で、アップデートを促進するための機能です。
アップデート画面を閉じることができるので 強制アップデートではないです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?