強制アプリアップデート
Status: Accepted
要約
重大なゼロデイ脆弱性を検知した場合や外部サービスのインターフェースが変更された場合などに対応するため、以下の方針でアプリのアップデート要否を確認します。
- アップデートを強制する要件は以下とする
- ゼロデイ脆弱性など、セキュリティ上の重大な問題を検知した場合
- 外部サービスのインターフェースが変更された場合
- アプリの機能を追加、または更新した場合(都度、強制アプリアップデートが必要かを判断する)
- アップデート要否の確認はアプリ起動時に実施する
- アプリから端末のOSとアプリのバージョンをバックエンドAPIに送信して、アップデート要否を受け取る
コンテキスト
モバイルアプリでは、アプリのアップデートタイミングはユーザに委ねられており、基本的には提供元がコントロールできません。 しかし、重大なゼロデイ脆弱性を検知した場合や外部サービスのインターフェースが変更された場合など、ユーザの利用しているアプリを強制的にアップデートさせたいという要求は少なからずあります。
そのため、アップデートするまでユーザがアプリを利用できないようにする仕組みを検討します。
前提として、アプリのアップデートはApp StoreやGoogle Playを介して行うものとします。 Expo Updatesなどを使用したOTAアップデートは対象外とします。
議論
アップデートを強制する要件
アプリのアップデートを強制する要件としては、以下の候補が挙がりました。
- ゼロデイ脆弱性など、セキュリティ上の重大な問題を検知した場合
- 外部サービスのインターフェースが変更された場合
- アプリの機能を追加、または更新した場合
セキュリティ上の重大な問題を検知した場合は、早急にアプリをアップデートする必要があります。また、外部サービスのインターフェースが変更された場合も、アプリをアップデートしないとそれらに関する機能が利用できなくなります。
そのため、これら2つの要件に関しては強制アップデートの対象とします。
アプリの機能追加・更新に関しては、様々な要件があるため一概に強制アップデートの対象とするかは決められないという意見が挙がりました。
ユーザにアップデートを強制することは、ユーザ操作を中断することになります。 機能追加・更新時に都度アップデートを強制すると、ユーザがストレスを抱える要因になる可能性があります。
一方で、アプリの機能を利用できない不具合が発生した場合などは、アップデートを強制して、可能な限り早く修正したアプリをユーザに提供する必要があります。
このように、機能によって強制アップデートの要否が変わります。 そのため、機能の追加、更新に伴う強制アップデートの要否は、都度判断することにします。
アップデート要否の確認タイミング
アップデート要否の確認タイミングとしては、以下の候補が挙がりました。
- アプリ起動時
- アプリ起動時 + アプリ復帰時(バックグラウンドからフォアグラウンドに移行時)
- アプリ起動時 + バックエンドAPIとの通信時
- (可能な限り)即時
アプリ起動時のみ確認する場合に比べると、他の候補はユーザに対してアップデートを要求する機会が増えます。
例えば、重大なゼロデイ脆弱性に対応したアプリをリリースした場合を考えます。
アプリ起動時のみ確認する場合は、ユーザがアプリを再起動するまでアップデートは要求されません。アプリを長時間起動しているユーザは、脆弱性を抱えたアプリを利用し続けることになります。 上記で挙げた候補は、上から順にアップデートを要求するタイミングが多くなるため、それに対するリスクは軽減されます。
その反面、考慮すべき要素も増えます。
例えば、ユーザが画面で入力中にアップデートを要求すると、入力中のデータは失われます。これを回避するためには、入力中のデータを保存しておき、次回のアプリ起動時に復元する必要があります。
プッシュ通知をタップしてアプリを起動した場合も同様です。プッシュ通知をタップ後に遷移する予定だった画面を保存しておき、次回のアプリ起動時にその画面へ遷移しないと、ユーザは該当の画面に到達できない可能性があります。
また、即時にアップデート要否を確認する場合は、外部サービスの導入や新しい技術スタックの追加も必要になります。
これらを全て考慮すると、開発コストは増大します。
そのため、このアプリではアプリ起動時のみアップデート要否を確認することにします。アプリを長時間起動しているユーザには、アップデートを要求するタイミングが遅れてしまいますが、それは許容します。
アップデート要否の確認方法
このシステムにはアプリから接続するバックエンドAPIがあるため、アップデート要否の確認はバックエンドAPIで実施することにしました。
アプリからは、以下の情報をバックエンドAPIに送信します。
- 端末のOS
- iOS
- Android
- 使用しているアプリのバージョン
これらの情報を元に、バックエンドAPIではアップデート要否を確認後、結果をレスポンスとして返却します。
今回は、アプリ起動時にアップデート要否を確認するのみだったので、既存のバックエンドAPIで実施しました。 しかし、即時、または定期的にアップデート要否を確認したい場合などは、以下のようなサービスの利用も検討すると良いでしょう。
決定
- アップデートを強制する要件は以下とする
- ゼロデイ脆弱性など、セキュリティ上の重大な問題を検知した場合
- 外部サービスのインターフェースが変更された場合
- アプリの機能を追加、または更新した場合(都度、強制アプリアップデートが必要かを判断する)
- アップデート要否の確認はアプリ起動時に実施する
- アプリから端末のOSとアプリのバージョンをバックエンドAPIに送信して、アップデート要否を受け取る