こんにちは、 id:numanuma08 です。Androidのアプリ内アップデートの挙動について調査をしたので、その結果と検証環境の構築についてまとめます。
アプリ内アップデートとは?
Google play関連のサービスの1つとして利用可能な機能で、アプリの中からユーザーに対してアップデートの通知と実行をさせる機能です。アップデートの方法は「フレキシブルアップデート」と「即時アップデート」があって、それぞれ動作が違います。
フレキシブルアップデート
アップデート中でもユーザーはアプリの操作が可能です。Google playからバイナリのダウンロードをバックグラウンドで行って、アプリの再読み込みが必要になるとSnackbarでユーザーに再読み込みをさせます。
即時アップデート
アップデート中はユーザーのアプリ操作ができません。アップデーの進行度合いを表す画面が表示されて、ユーザーはアプリを操作できなくなります。アップデートが完了すると、自動的にアプリが終了します。
どちらのパターンでもユーザーはアップデートを中断できます。
アプリ内アップデートをテストするには
アプリ内アップデートをテストするには内部アプリ共有を利用します。
内部アプリ共有を使うと特定のURLを知っているテスターや、メーリングリストに登録されているテスターにアプリを配布できます。Google playで利用できる他のアプリ配布方法(オープンテスト、クローズドテスト、内部テスト)と何点か違うところがあります。
- アプリがGoogle playで公開されている必要があります
- Google playで公開されていてダウンロード可能な状態になっているアプリでなければ内部アプリ共有は利用できません
- アプリの署名は特別なキーが利用されます
- アプリをビルドするときの署名キーではなく、Google playが生成した署名キーによって署名されます。そのため、他のアプリ配布方法で配布されたアプリに対してアップデートインストールができません
- アプリのインストールはバイナリごとに異なるURLからインストールして、URLには有効期限があります
- アプリをインストールするにはGoogle playアプリを開発者モードにして、オプションを有効にする必要があります
このあたりの注意事項はありますが、アプリ内共有を使うと次の手順でアプリ内アップデートをテストできます。
- アプリ内共有で2つのバージョンのアプリをアップロードしておく
- アプリ内共有から古いバージョンの方のアプリを端末にインストールして起動する
- アプリ内共有の新しいバージョンのアプリをインストールするためのURLを開いて、Google play上で「アップデート」が表示されていることを確認する。このとき、インストールしてはいけない
- インストールしたアプリでアプリ内アップデートを試す
手順3でGoogle playからインストールしない点が大事。
アプリ内アップデートの挙動
強制アップデートをした時の動画を掲載します。
サンプル実装なのでボタンを押すと強制アップデートが実行されるようにしていますが、画面を開いたらすぐアップデート確認画面を出す実装も可能です。動画ではアップデート完了後、手動でアプリを立ち上げています。しかし、Google Playで配布されているアプリ でアプリ内アップデートを実行したときは、アップデート完了後に自動でアプリが再起動しました。この辺りの動作についてはドキュメントに掲載されておらずまた、内部アプリ共有を使ったデバッグと動作が異なる部分でした。
また、Screen piningを使ってアプリを固定した場合の挙動を掲載します。
自動アップデートに失敗して、手動でアプリの終了と起動が必要でした。
まとめ
Androidのアプリ内アップデートを調査しました。デバッグするための環境構築方法と、特定条件下での動作、デバッグ時とリリース時の動作の違いなど気をつける部分が多いです。実装自体は簡単なので、色々な要件に合わせてアプリ内アップデートが利用できるかどうか検討するといいでしょう。