【Unity iOSアプリ開発】サーバーレスでアプリアップデートを誘導する

こんにちは。IAFです。

先日AppStoreへのアプリ公開が完了したので、

いざ、

アプリのバージョンが最新でない場合、アップデートへ誘導する

機能の実装をしてみました。

例のごとく詰まった箇所が出てきたので方法含めメモしておきます。

 

アプリのアップデートを誘導するには?

前提条件
  • iOSアプリかつAppStoreへの公開ができていること

 

アプリのバージョンが最新かどうかを調べる方法

方法としては複数あります。以下のサイトが参考になりました。

to-me-mo-rrow

はじめにモバイルアプリ(スマホアプリ)の強制アップデート(アップデートのお知らせ)に関して調べたり、検討したりしたので簡…

このページを表示している通りレンタルサーバーのphpに記述をする方法も書かれています。

…なのですが、自力での書き換え部分が増えてしまいます。それはメンドクサイ。

ほかにもAPIやら別システム経由したりする方法もある…大変そうです。

…ということで、AppStoreへアクセスし最新バージョンを取得して比較、という方法で実装することを選びたいと思います。

 

詰まるポイントと対処

AppStoreConnectにアクセスするURLのフォーマットが分からないと取得できない。これに尽きます。

※間違っていても空のJSONファイルが取得できるため、間違っているのかわかりづらいのが問題です。

 

以下URLでアクセスすればOKです(2021/08時点)。

https://itunes.apple.com/①/lookup?id=②

①はアプリを公開しているリージョン。私は日本限定で公開していて、日本のリージョンは”jp”。

②はアプリID。AppStoreConnectのApp情報に表示されるアプリ固有のApple ID(10桁の数字)

 

なお、PCのインターネットブラウザのアドレスバーに上記をそのまま打ち込んでアクセスすると、正しければ以下のようなファイルが取得できます。


{<br />
 "resultCount":1,<br />
 "results": [<br />
{"ipadScreenshotUrls":[], "appletvScreenshotUrls":[],<br />
--- 中略 ---<br />
"version":"1.0.2",<br />
--- 中略 ---<br />
}<br />

ついでです。正しくないアドレスの場合、以下のような空のJSONが返ってきます。


{<br />
 "resultCount":0,<br />
 "results": []<br />
}<br />

Unityでのコード実装前に、アドレスが正しくAppStoreConnectからデータが取得できるかを事前に確かめておくのがおススメです。

 

Unityでの実装

接続すべきアドレスを確かめたらあとは実装するだけです。具体的には以下コードのようにしてタイムアウト付きでアクセスすることになると思います。


url = string.Format("上記のアドレス");<br />
r = UnityWebRequest.Get(url);<br />
www = await r.SendWebRequest().ToUniTask().Timeout(TimeSpan.FromSeconds(3));

(UniTaskでタイムアウト処理(3秒)付きで実装してます)

その他の処理は以下サイトを参考にすればなんとかなるはず。iOSでアクセスするだけなら書かれているライブラリは両方とも不要です。

Nobollel開発者ブログ

どうも、エンジニアの水津です 今回はUnityにおいて、アプリの更新がある場合にストアに誘導するポップアップを表示する実…

 

なお、テストする際は、

公開しているアプリよりPlayer Settingのバージョンを落として、通常のxcodeによる実機デバックで確かめられます。

(Test Flightすら不要)

 

余談:アプリのアップデートって必要?

散々書いた後ではあるのですが、アップデート処理が必要なのは「オンラインゲーム」に限ると考えています。

(そもそもオフラインゲームではアップデートしなくて不具合あってもユーザー側で対処しやすい)

そしてオンライン対戦ゲームではサーバーを介するのでサーバー側で対応できる方法もあります。念のため。

私はPhoton Serverを使用してますが、Photon Serverは、

「アプリのバージョンが異なる場合マッチングしない」

という実装が可能です。ユーザー責任でアップデートしない場合機能追加しないよ、という割り切りであればこのような方法を採るのもアリ、と考えます。

 

その他参考

タイムアウト処理
Qiita

UniTaskとはUniTaskとはUnity向けに最適化されたTask実装を提供するライブラリです。もとはUniRxに…