[Android] in-app updates APIを使ってアプリ内アップデートを行う。

よくあるアプリアップデート手段といえば、サーバーAPIでバージョンチェックAPIとかを用意して、バージョンチェックAPIの結果を見てGooglePlayに飛ばすってやつだと思う。

in-app updates はサーバーAPIを使わずとも、アプリの更新があることを検知し、しかもGooglePlayに飛ばなくてもアプリを更新できるというすぐれもの。

超ざっくりと動作確認を行ってみた。

公式ドキュメントはこちら。

In-app updates  |  Android Developers
スポンサーリンク

実装

前提条件

in-app Updates APIを使うための条件は以下のとおりです。

UIのタイプ

UIのタイプはFlexible( 柔軟性 )とImmediate(即時)がある。

Flexible

バックグラウンドでのダウンロードとインストールを適切な状態監視で提供するユーザーエクスペリエンス。このUXは、アップデートのダウンロード中にユーザーがアプリを使用することが許容できる場合に適しています。たとえば、アプリのコア機能にとって重要ではない新機能を試すようにユーザーに促します。  (公式を翻訳)

Immediate

アプリを継続して使用するには、ユーザーがアプリを更新して再起動する必要があるフルスクリーンのユーザーエクスペリエンス。このUXは、アプリの継続的な使用のために更新が重要な場合に最適です。ユーザーが即時のアップデートを承認した後、Google Playはアップデートのインストールとアプリの再起動を処理します。 (公式を翻訳)

コード

異常系とか何も考えていないけど、とりあえず動作確認ができるコードです。

//
private lateinit var manager: AppUpdateManager
private lateinit var listener: InstallStateUpdatedListener
private fun updateCheck() {
    manager = AppUpdateManagerFactory.create(this)
    listener = InstallStateUpdatedListener {
        if (it.installStatus() == InstallStatus.DOWNLOADED) {
            manager.unregisterListener(listener)
        }
    }
    manager.registerListener(listener)

    manager.appUpdateInfo.addOnCompleteListener { task ->
        val info = task.result

        when (info.updateAvailability()) {
            UpdateAvailability.UPDATE_AVAILABLE -> {
                Toast.makeText(this@MainActivity, "更新処理を開始します。", Toast.LENGTH_SHORT).show()
                // 更新処理
                manager.startUpdateFlowForResult(info, AppUpdateType.IMMEDIATE, this, 1129)
            }
            UpdateAvailability.UPDATE_NOT_AVAILABLE -> {
                // アップデートがない
                Toast.makeText(this@MainActivity, "アップデート無いです。", Toast.LENGTH_SHORT).show()
            }
        }
    }
}

結構短めのコード量でアップデートのチェックができる。

UIのタイプを変更するのはstartUpdateFlowForResultに渡しているTypeをIMMEDIATEFLEXIBLEに変更すれば良い。

結果

Flexible

Immediate

所感

全画面にアップデート画面出せば強制アップデートとかに使えるかなって思ったけど、右上に✕ボタンがあって普通に画面を閉じられた。

強制アップデートには使えなさそうで残念。。。 閉じられなくする方法はあるかもしれないけど調べてない。

ただ、アプリを起動中にアプデができるのは良いなって思う。なのでサーバーAPIと連動してやれば使い勝手は良くなる気がする。

あまり情報がまだ見当たらないので、実際に実装するのはもっと情報が集まってからだろうなw

タイトルとURLをコピーしました