App Storeのキャッシュに苦しめられた話
見出し画像

App Storeのキャッシュに苦しめられた話

 App Storeにあるアプリの最新情報ってJSONで取得できるんですね。Sirenというライブラリのソースコードを眺めているとこういう箇所がありました。簡単に説明すると https://itunes.apple.com/lookup?bundleId=${BUNDLE_ID}&country=${COUNTRY}にアクセスするとApp Storeの該当のアプリの情報が取得できるということです。試しに僕の個人アプリの# Typeの情報を取得してみましょう。 https://itunes.apple.com/lookup?bundleId=me.fromkk.type&country=JP を叩くとアプリの情報が閲覧できることが分かります。

何が問題だったのか

 今回発生したのは個人的に関わっているアプリで先述したSirenを利用してアプリを開いた時に新たに更新があればアップデートを促すといった機能がありました。しかし、今回は何故かこの機能が動作しませんでした。原因を調べていくとApp Storeから取得したアプリのバージョンが古かったことが原因でした。何故発生したのか原因を調べていく中で上記のURLにアクセスしていることが分かりました。URLがわかったのでブラウザで普通にアクセスしてみると元々欲しい値(正しい値)になっていました。ただ、アプリからアクセスした時のみ古い値が返ってきました。この時点でキャッシュ的な存在を疑いますが、ブラウザからアクセスすると正しく返ってくることからアプリ側のキャッシュを疑いました。しかし、アプリを新規でインストールしても古い値となることが分かりました。

試行錯誤

 ということで原因がApp Storeの方にありそうだということが判明してきます。次からはアプリから上記のURLを叩く方法を変更することで値がどう変わるのかを見ていきました。単純にUser Agentを変更してみると...いきなり欲しい値が取得できました。やはり何かしらのキャッシュが効いていたということですね。ただ、User Agentだとまたキャッシュされることが心配なのでアクセスするURLを都度変更(URLのクエリーにタイムスタンプを付与)するようにしてアクセスすることでキャッシュされないように対応しました。

対策

 App Storeへのアクセスの方法を変更するにはライブラリ側に手を入れる必要があります。しかし、今回はApp Storeにあるバージョンさえ取得できれば良かったのでSirenとは決別して直接URLを叩く方式に変更しました。(もし何かしらのライブラリにコントリビュートしたいという方がいましたらここにいいissueが落ちてますよ

まとめ

 業務終わりに緊急性が高そうな連絡があり何事かと調べていったらこういうことでした。もしかしたらSirenを利用しているアプリには同様の事象が起こり得る可能性があるのでここにまとめておきます。もし、同様の事象が発生して、別の対策をされた方がいたら教えてください。

この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!
😍