Let's write β

プログラミング中にできたことか、思ったこととか

Fastlane gemのSpaceshipを使ってiOSアプリのバージョン番号のリストを取得する

APIサーバーを書いていてクライアント側に非互換な変更が入ったときに、 サーバー側から「アプリに新しいバージョンが出てるから必ずバージョンアップしてから使ってね」という 形の強制アップデートを要求したいケースがあります。

セマンティックバージョニング

そういうときに、アプリのバージョンを大小比較するにあたっては、

セマンティック バージョニング 2.0.0 | Semantic Versioning

セマンティックバージョニングを採用しておくと大小比較ができるので便利ですし、 バージョンをどうするか悩まなくてもどういう変更の入ったリリースかからある程度自動的に決まるので考えなくて済みます。

アプリからはサーバーサイドへのリクエスト時に必ずアプリケーションのバージョンをヘッダーにつけさせるようにし、 サーバーサイドではそのバージョンをパースして最小バージョンでなかったら適宜バージョンアップデートを促す専用の レスポンスを返すようにします。

rubyだと以下のgemがセマンティックバージョンの処理をしてくれるので便利でした。

github.com

SpaceshipでiTunes Connectのデータを取得

SpaceshipというのはFastlaneというアプリのリリース自動化を手伝ってくれるツール兼Gemの中に含まれるライブラリなのですが、

github.com

この機能として、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とやると、ストアに出ている最新バージョンが取得できます。 適宜、上記で取得したバージョンにフィルタリングしたり選ぶときの候補名の装飾に使うと便利だと思います。