バージョンチェックAPIとは
- アプリのアップデートがあるか
- そのアップデートは強制か
を調べるためのAPI。アプリの起動時に必ず叩かれる。
何のために必要なのか
割愛
[iOS]アプリに強制アップデート機能を導入すべき理由と、簡単に実装する方法
僕達が既に持っていた仕組み
リリースされているアプリのバージョン一覧を返すAPI。
[
"1.0.0",
"1.1.0",
"2.0.0"
]
アプリでこれを取得し、最新バージョンの1桁目が自分自身のバージョンの1桁目より大きければ強制アップデートダイアログを出す、というふうになっていた。(うろ覚え)
利点は、リリースするたびに1つ追加するだけで良いので更新がラクなこと。
今までの問題点
- バージョン番号のパースなど複雑なロジックがクライアントサイドにあった
- 複雑なロジックは極力サーバーサイドに持たせたい
- バグってて古いアプリが強制アップデートされなかったら目も当てられない
- 強制アップデートしたいのは、①提供の終了したAPIを使っているバージョン、 ②バグってるバージョン
- バグったバージョンがリリースされてしまったときに1桁目のバージョンを上げるのがカッコ悪い
- 1桁目を上げるとそれ以前のバージョンも強制アップデートになるし
今回作ったAPI
リクエストヘッダーのUser-Agentを見て、「アップデートがあるか」「強制アップデートがあるか」を返すAPI
擬似コード
latestVersion = Version(1,2,0)
def isUpdateRequired(version):
version < Version(1,1,0) || # サポートされていない
version == Version(1,1,4) # バグってリリースされてしまった等
def handleRequest(request):
version = parseUserAgent(request)
return {
"latest_version": latestVersion,
"update_available": version < latestVersion,
"update_required": isUpdateRequired(version)
}
アプリがリリースされるたびに latestVersion
を更新する。特に必要な時だけ isUpdateRequired
のロジックも更新する。
クライアントサイドの処理(擬似コード)
if response.update_required:
強制アップデートダイアログを出す
(ストアに飛ぶかアプリを終了するしかない)
else if response.update_available:
if isIgnored(response.latest_version): # 既にこのバージョンを無視したことがある
何もしない
else:
アップデート通知ダイアログを出す
if 無視する:
ignore(response.latest_version) # このバージョンを無視する
else:
ストアに飛ぶ
ポイント
- 無視したことをアプリ内に保存するためにサーバーから
latest_version
を返してもらっている-
latest_version
をキーにignored
という値を保存するなど
-
- 既に無視したことがあっても、強制アップデートであれば必ず強制アップデートダイアログが出る
その他
- 今まではリソースAPIとは別のドメインでバージョンチェックAPIを作っていたが、今回はリソースAPIと同じドメインにした。
- これはもしかすると良くなかったかもしれない。アプリを公開する人(クライアントサイドの人)が気軽に更新できるようにHerokuとかに分離しても良かったかも。
- と言っても今でも
latestVersion
を更新しなかったからといって特に困るわけでもない。
- バージョンチェックとは別に、リソースAPIがメンテ中であることを示すAPIも別ドメインでやったほうがよかったかもしれない。
- ドメインが解決できないとかサーバー全滅レベルの障害のときにもメンテ中APIだけは動き続けることができるので。
- 今はリソースAPIを叩く処理の中で、ステータスコードが503であればメンテ中ダイアログを出すようになっている。
ここらへんはもうちょっと考えてみてもよいかも。