LoginSignup
7
9

More than 5 years have passed since last update.

アプリのバージョンチェックAPIを作ってみて

Last updated at Posted at 2015-03-13

バージョンチェック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であればメンテ中ダイアログを出すようになっている。

ここらへんはもうちょっと考えてみてもよいかも。

7
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
9