App Storeでのサブスクリプションのテストは非常に重要ですが、適切に行うのは簡単ではありません。Appleのサブスクリプション関連ドキュメントは……正直に言って物足りず、テスト用のリソースもあまり提供されていません。そこで私たちは、そのギャップを埋めるためにこのガイドを作成しました。
Appleがサブスクリプションに変更を加えたり、より効果的なテスト方法が見つかった際には、この投稿も随時更新していく予定です。
Android向けのガイドをお探しですか?Androidサブスクリプションテストガイドはこちらをご覧ください >>
このガイドは、TestFlight におけるサブスクリプションテストの変更を反映するために、2024年12月に更新されました。
iOSテスト環境
iOSアプリを開発やリリースの各段階でテストする際には、3つの異なるテスト環境を使用することができます。これには、サンドボックス(開発者ビルド)、TestFlight(プロダクションサンドボックス)、そしてプロダクション(App Store)が含まれます。これらの環境はそれぞれ挙動が少しずつ異なるため、理想的にはアプリをリリースする前にすべての環境でテストを行うべきです。
サンドボックスでのiOSテスト
開発者用サンドボックスは、テストの第一段階として重要な役割を果たします。プロダクション環境でのテストに進む前に、開発中にこのサンドボックスの特性や制限をしっかりと把握しておくことで、後の 工程で時間を節約できます。
開発者サンドボックスでテストを行うには、Xcodeでアプリを「デベロッパービルド」としてビルドする必要があります。開発者は通常、開発中にデバイス上で素早く動作確認を行うためにこの環境を使いますが、TestFlightやベータ版審査を経ずに、プロビジョニングされたデバイスを使ってQA担当者や社内テスターにもこのビルドを配布することができます。
アプリがApp Store外で広く配布されるのを防ぐために、Appleはデバイスごとのプロビジョニング数を制限しています。iPhone、iPad、Apple Watch、Apple TV、Macの各デバイス種別ごとに最大100台まで、合計で500台が上限です。
iOSの開発者用サンドボックスでテストを行うには、サンドボックスアカウントが必要です。この点についてはAppleの公式ドキュメントが比較的よく整備されており、今後も最新の情報が保たれることを願いたいところです。
新しいサンドボックスアカウントで初めてサインインするには、まず開発者ビルドのアプリ内で購入を試みる必要があります。この方法でサンドボックスアカウントにログインすると、その後、設定アプリを開き、iTunes & App Storeをタップし、画面を一番下までスクロールするとSandbox Accountのセクションが表示されます。
このセクションでは、テスト用に複数のサンドボックスアカウントをログイン・ログアウトして切り替えることができます。もし誤ってサンドボックスアカウントを本番のApp Storeで使用してしまうと、そのアカウントはサンドボックス環境で使用できなくなります。迷ったときは、新しいサンドボックスアカウント を作成して再度テストするのが確実です。
(設定アプリのSandbox Accountセクションは、iOS 12で導入されました。iOS 11以前でテストする場合は、まず本番用のApp Storeアカウントからサインアウトし、アプリ内で求められたときにテストアカウントでサインインする必要があります。)
テスト購入を行おうとすると、デバイスが何度もサンドボックスアカウントへのサインインを求めてくる場合があります。これは正常な動作であり、ダイアログが表示されるたびにサインインしてください。最終的にiOSが認証を完了し、購入が正常に進むようになります。なお、この挙動は本番環境では見られず、あくまでサンドボックス環境特有の挙動です。
信頼性についての注意点
開発者用サンドボックス環境は、信頼性が低いことでよく知られています。(参 考までに、RevenueCatではサンドボックス環境の稼働状況を確認できる便利なダッシュボードを提供しています。)Appleが意図的に本番環境で起こりうる問題を模倣するためにパフォーマンスを制限しているのか、それともApple自身もこのサンドボックスを内部のテストに使用していて、意図せず頻繁に壊しているのかは定かではありません。
いずれにせよ、コードが正しく動作しているにもかかわらず、サンドボックス側で問題が発生することがあるという点を念頭に置いておいてください。そうした状況は、予期しないエラーをどのように処理するかを見直す良い機会でもあります。
とはいえ、「本番に出せば自然に直るだろう」といった楽観的な見方は禁物です。このガイドでは既知のサンドボックスの癖についても紹介していますが、それでもアプリを公開する前に、サンドボックス内で購入フローをエンドツーエンドで確実にテストできるようにしておくべきです。
開発者用サンドボックス環境におけるサブスクリプションの更新間隔
サンドボックスでは、サブスクリプションや無料トライアルの期間が大幅に短縮されており、これはテスト目的のために設定されています。この仕組みによって、開発者は購入、更新、失効といった一連のフローを迅速かつ繰り返しテストすることが可能になります。
| App Store Duration | Sandbox Duration | Testflight |
| 3 days | 2 minutes | 1 day |
| 1 week | 3 minutes | 1 day |
| 1 month | 5 minutes | 1 day |
| 2 months | 10 minutes | 1 day |
| 3 months | 15 minutes | 1 day |
| 6 months | 30 minutes | 1 day |
| 1 year | 1 hour | 1 day |
(この「3日間の期間」についてはAppleの公式ドキュメントには記載されていませんが、サンドボックスのトランザクションを確認することで把握できます。)
App Store Connectのサンドボックステストアカウントの設定から、サブスクリプションの更新間隔を変更することができます。
サブスクリプションはアカウントごとに最大12回まで自動更新されますが、実際の更新回数はランダムです。12回の更新を超えると、それ以降は自動的に更新が止まります。
App Storeと同様に、アプリが開 かれていなくても更新は自動的に行われます。ただし、App Storeとは異なり、サンドボックス環境では購読のキャンセルや払い戻しはできないため、それらのシナリオを直接テストすることはできません。また、サブスクリプション管理のテストも行えません。
各自動更新は決済キューに追加されます。アプリを再度起動すると、その間に発生したトランザクション(時間の経過に応じて複数ある場合もあります)が処理されます。最新のレシートを確認するには、一度アプリを閉じてから再度開くようにしてください。レシートをサーバー側でリフレッシュしている場合は、これらの追加トランザクションもレシートに表示されるはずです。
テスト手順
更新とサブスクリプションの有効期限切れ
- 月額サブスクリプションに登録します。
- アプリを閉じて、20分のタイマーをセットします。
- 20分後にアプリを再起動し、まだサブスクリプションが有効な状態であることを確認します。
- アプリを閉じて、再度20分のタイマーをセットします。
- さらに20分後(サブスクリプション購入から約40分後)にアプリを再度起動します。すると、アプリは未購読の状態に戻り、ユーザーが再度サブスクリプションに登録できるようになるはずです。
有効期限切れ後の購入の復元
- 月額サブスクリプションに登録します。
- アプリを閉じて、35〜40分待ちます。
- アプリを起動します(未購読の状態に戻っているはずです)。
- 購入を復元ボタンをタップします。
- アクティブなサブスクリプションは見つからず、ユーザーにはその旨を伝えるメッセージが表示されるべきです。
有効なサブスクリプション期間中の購入の復元
iOSのサンドボックス環境でのテストにおける大きな注意点の1つは、購入が行われるまでデバイス上にレシートファイルが存在しないことです。これは、インストール時にレシートファイルが生成されるプロダクションサンドボックスおよび本番環境とは異なります。サンドボックスでの購入復元を完全にテストするには、アプリを未購読の状態に戻すためのボタンやジェスチャーなどの手段を追加する必要があります。
- 月額サブスクリプションに登録します。
- ボタンやジェスチャーを使用して、アプリを未購読の状態に戻します。
- 購入を復元ボタンをタップします。
- これを35分のサブスクリプション期間が終了する前に実行すれば、有効なサブスクリプションが見つかり、アプリは購読中の状態に戻るはずです。
複数デバイス間での購入の復元
- デバイスAで月額サブスクリプションに登録します。
- サブスクリプションが失効する前に、デバイスBにアプリをインストールします。
- デバイスBで、デバイスAで使用したものと同じサンドボックスアカウントにログインします。
- デバイスBでアプリを起動します。
- 購入を復元ボタンをタップします。
キャンセルのテスト
- 月額サブスクリプションに登録します。アプリがサブスクライブ状態になっていることを確認します。
- 設定アプリ > App Store > 使用中のサンドボックスアカウント > 管理 > サブスクリプション と進み、登録済みのサブスクリプションを選択します。
- サブスクリプションをキャンセルし、利用規約に同意します。
- アプリを終了し、10分ほど待ちます。
- アプリを再起動します。
- アクティブなサブスクリプションは検出されないはずです。
アップグレード、ダウングレード、クロスグレードのテスト
iOS 14以降では、設定アプリ内のサンドボックス用サブスクリプション管理画面からこれらの操作をテストできます。iOSの古いバージョンをテストする場合は、アプリ内にボタンなどの手段を用意して、アップグレード、ダウングレード、クロスグレードをトリガーする購入をテストする必要があります。
- 月額サブスクリプションに登録します。
- アプリを終了します。
- 設定アプリ > App Store > 使用中のサンドボックスアカウント > 管理 > サブスクリプション に進み、現在のサブスクリプションを選択します。
- リストから別のプロダクトを選択してサブスクリプションを変更します。
- もしサブスクリプションをダウングレードした場合は、5〜10分ほど待ちます。
- アプリを起動します。
- ユーザーは新しいプロダクトにサブスクライブされているはずです。
購入の中断
※この挙動はiOS 14以降でのみ可能です。
- App Store Connect > Users and Access > Sandbox Testers に移動し、「Interrupt Purchases for This Tester(このテスターに対して購入を中断する)」を有効にします。
- このユーザーとしてログインした状態で、自動更新サブスクリプションを購入します。
- 利用規約のダイアログが表示されたら、「キャンセル」をタップして利用規約に同意しないでください。
- アプリが購入を解除していないか確認します(解除されるべきではありません)。レシートには、今試みた購入は含まれていないはずです。
- もう一度購入を試み、今度は利用規約に同意してください。
- アプリを更新すると、有効なサブスクリプション購入が反映されているはずです。
重要なポイント
- サンドボックス環境では、サブスクリプションは通常よりも早いペースで自動更新されます。
- サンドボックスでは、購入が行われるまでレシートは生成されません。
- StoreKitTest を使ってテストしている場合でも、定期的に実際のサンドボックス環境でアプリをテストすることを忘れないでください。
開発者用サンドボックスにおけるトライアルの利用資格
アプリ内にユーザー向けの無料トライアルを提供する「初回オファー付きのプロダクト」が含まれている場合、それらのオファーを受け取る資格があるユーザーのみにトライアル情報がペイウォール上に表示されるかどうかをテストする必要があります。まず、新規のサンドボックステスターアカウントを使用してアプリを起動し、初回オファーがあるプロダクトに対して正しい文言が表示されているか確認します。その後、実際にそのプロダクトを購入し、すぐにキャンセルして、上述の短縮されたサンドボックスの期間に基づいてトライアルが終了するのを待ちます。
トライアル終了後、再度ペイウォールを開き、そのアカウントで該当のプロダクトが「トライアルを受け取る資格がない状態」として表示されているか確認します。ペイウォール上の文言は、もはや無料トライアルが提供されることを示していないはずです。このテストを繰り返したい場合は、these Apple の提供する手順に従って、サンドボックスユーザーのトライアル利用資格をリセットすることができます。
さらに詳しく
- アプリ内課金テスト (Apple公式ドキュメント)
- アプリ内課金トランザクションのテスト (Apple公式ドキュメント)
StoreKitTest
iOS 14以降、StoreKitTestフレームワークを使用して、Xcode上でローカルにStoreKitのテストが可能になりました。これにより、App Store Connectでの製品の追加、購入処理、サブスクリプションライフサイクルの一連の流れなど、AppleのStoreKitシステム全体をシミュレートできます。Appleのサンドボックス環境でのテストに比べて、より迅速にテストできるのが利点です。StoreKitTestは、コンテンツのロック/アンロックといった一部機能のテストに活用するのがおすすめです。ただし、最終的なテストは必ずサンドボックス環境でも行い、App Store Connectでの設定が正しく機能していることを確認する必要があります。
StoreKitTestでのサブスクリプション更新間隔の設定
デフォルトでは、StoreKitTestを使用して行ったサブスクリプションはリアルタイムで更新されます。ただし、StoreKitTestの構成ファイル(Configuration File)をXcodeで開き、「Editor > Subscription Renewal Rate」に移動することで、更新間隔を変更することが可能です。ここで提供されているいずれかの更新間隔を選択することで、より柔軟にテストのスピードやシナリオを調整できます。
TestFlightを使ったiOSテスト
TestFlightはサンドボックス環境と似た挙動をしますが、実際のApp Storeアカウントを使用します。TestFlight経由で配布されたアプリは、自動的に本番用サンドボックス環境を使用して課金処理を行います。TestFlightビルドではユーザーが実際に課金されることはありませんが、ペイウォールを表示したり、購入フローを実際に踏んで動作を確認したりすることが可能です。

