よくあるアプリアップデート手段といえば、サーバーAPIでバージョンチェックAPIとかを用意して、バージョンチェックAPIの結果を見てGooglePlayに飛ばすってやつだと思う。
in-app updates はサーバーAPIを使わずとも、アプリの更新があることを検知し、しかもGooglePlayに飛ばなくてもアプリを更新できるというすぐれもの。
超ざっくりと動作確認を行ってみた。
公式ドキュメントはこちら。
実装
前提条件
in-app Updates APIを使うための条件は以下のとおりです。
- Android 5.0 (API level 21) 以上
- Play Core Library 1.5.0 以上
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をIMMEDIATEかFLEXIBLEに変更すれば良い。
結果
Flexible
Immediate
所感
全画面にアップデート画面出せば強制アップデートとかに使えるかなって思ったけど、右上に✕ボタンがあって普通に画面を閉じられた。
強制アップデートには使えなさそうで残念。。。 閉じられなくする方法はあるかもしれないけど調べてない。
ただ、アプリを起動中にアプデができるのは良いなって思う。なのでサーバーAPIと連動してやれば使い勝手は良くなる気がする。
あまり情報がまだ見当たらないので、実際に実装するのはもっと情報が集まってからだろうなw