APIサーバーを書いていてクライアント側に非互換な変更が入ったときに、 サーバー側から「アプリに新しいバージョンが出てるから必ずバージョンアップしてから使ってね」という 形の強制アップデートを要求したいケースがあります。
セマンティックバージョニング
そういうときに、アプリのバージョンを大小比較するにあたっては、
セマンティック バージョニング 2.0.0 | Semantic Versioning
セマンティックバージョニングを採用しておくと大小比較ができるので便利ですし、 バージョンをどうするか悩まなくてもどういう変更の入ったリリースかからある程度自動的に決まるので考えなくて済みます。
アプリからはサーバーサイドへのリクエスト時に必ずアプリケーションのバージョンをヘッダーにつけさせるようにし、 サーバーサイドではそのバージョンをパースして最小バージョンでなかったら適宜バージョンアップデートを促す専用の レスポンスを返すようにします。
rubyだと以下のgemがセマンティックバージョンの処理をしてくれるので便利でした。
SpaceshipでiTunes Connectのデータを取得
SpaceshipというのはFastlaneというアプリのリリース自動化を手伝ってくれるツール兼Gemの中に含まれるライブラリなのですが、
この機能として、iTunes Connectから情報を引っ張ってくる機能があります。
require 'fastlane' Spaceship::Tunes.login("<itunes connect email>", "<itunes connect password>") app = Spaceship::Tunes::Application.find("<bundle id>") version_strings = app.versions_history.map{|h| h.version_string}
これでversion_strings
のなかに["1.0.0", "1.0.1", "1.1.0", "2.0.0"]
のようなバージョン番号の配列が入ります。
これを適宜サーバーサイドに設置した管理ページなどから選択してやって、それが最低バージョンの保証のコードに反映されるようにすると、
動的に最低バージョンの保証を変更することができるようになります。
手作業でバージョン番号を文字列で入れるようにしてしまうと、 打ち間違いやら、あり得ないバージョンが選択されてしまったりするので、 確実に存在するバージョンを選べるようにしておくと安心です。
またapp.edit_version.version
とやると、「リリース待ち(作ってから、ストアに出ていないバージョン)のバージョン」が取得でき
app.live_version.version
とやると、ストアに出ている最新バージョンが取得できます。
適宜、上記で取得したバージョンにフィルタリングしたり選ぶときの候補名の装飾に使うと便利だと思います。