iOS の家計簿アプリをつくる(強制アップデート編)

advent_calendar アドベントカレンダー

はじめに

こちらは個人開発アプリができるまで by am10 Advent Calendar 2024の 20 日目の記事です。

20 日目は強制アップデートについてです。
致命的なバグがあったときなどユーザーにアプリをアップデートしてもらいたいときにアラートを出してストアに飛ばすやつです。

やり方としては下記 3 つを考えました。

  • Firebase Remote Config を使う
  • iTunes Search API を使う
  • 独自のサーバーを使う

Firebase Remote Config を使う

下記の Firebase Remote Config を使う方法です。

Firebase Remote Config を使ってみる

導入方法は公式ドキュメントかいろいろ記事があるのでそちらを見てもらえればと思います。
Firebase コンソールで下記のようにストアに公開したアプリのバージョン情報を追加します。

1

アプリ側で下記のように実装をすればバージョン比較ができます。

メリット

  • リアルタイム通知を受けられる
  • shouldUpdate フラグなど値を追加すれば特定バージョンのみ表示もできる

デメリット

  • Firebase を導入する必要がある

iTunes Search API を使う

続いて iTunes Search API を使う方法です。

iTunes Search API: Overview
Describes the iTunes Search API used to place search fields in a website.

下記の形式でアクセスすれば App Store から公開しているアプリ情報が取得できます(bundleId=[バンドル ID]でも取得できるようです)。

アプリ ID はストアの URL の idXXXXXXXXXX となっている数字の部分です。
試しに私がリリースしている「サイコロ人生」というアプリでやってみると下記のような JSON が返ってきます。

‎サイコロ人生
‎いつでもどこでもサイコロがふれるアプリです。 どれを買うか、どこに行くかなどなにかの選択に迷ったときはサイコロをふって決めちゃいましょう! サイコロは1~3個まで同時にふれます。 サイコロの他にもコイントスとルーレットができます。 コインは1~3枚。 ルーレットの玉は10色でそれぞれ0~100個まで設定できます。

注意点として、iTunes Search API はキャッシュの影響で古い情報を返すことがあります。そのため、下記記事を参考にクエリーにタイムスタンプを付与してキャッシュを回避することが必要です(例:https://itunes.apple.com/lookup?id=[アプリ ID]&timestamp=[現在時刻])。

App Storeのキャッシュに苦しめられた話|かっくん / iOS Developer
 App Storeにあるアプリの最新情報ってJSONで取得できるんですね。Sirenというライブラリのソースコードを眺めているとこういう箇所がありました。簡単に説明すると {BUNDLE_ID}&country=${COUNTRY}にアクセスするとApp Storeの該当のアプリの情報が取得できるということで...

アクセスするURLを都度変更(URLのクエリーにタイムスタンプを付与)するようにしてアクセスすることでキャッシュされないように対応しました。

アプリ側で下記のように実装をすればバージョン比較ができます。

メリット

  • 自前でとくに何も用意する必要がない

デメリット

  • バージョンしかわからないのでストアに新バージョンがあれば必ずアラートを出すことになる

独自のサーバーを使う

最後にサーバーを用意してそこにバージョン情報をおく方法です。
今回のアプリの場合はスプレッドシートを使っているのでスプレッドシートにバージョン情報を記載するでもいいでしょう。他の簡単な方法としては GitHub に JSON ファイルを置く方法です。

アプリ側の処理は iTunes Search API を使う方法と似たようなものです。

メリット

  • shouldUpdate フラグなど値を追加すれば特定バージョンのみ表示もできる

デメリット

  • 自前で用意する必要がある

実装

今回は 3 つ目の方法で GitHub にバージョン情報の JSON を置くことにします。

こんな感じで JSON ファイルを置きます。

https://raw.githubusercontent.com/adventam10/ExpenseLog/refs/heads/main/AppVersion.json

AppVersionChecker.swift ファイルを作成し下記のように実装します。

ContentView を下記のように修正します。

これでアプリがアクティブになったときに毎回バージョン比較しバージョンが違えばストアへ遷移させるアラートを表示するようになりました。

おわりに

もしものための強制アップデート機能も実装できたのでこれで安心です。

明日は単体テストを実装します。

Amazon.co.jp

コメント

タイトルとURLをコピーしました