ドキュメント

Sandboxでのアプリ内課金のテスト

Sandbox環境で実際のプロダクト情報とサーバ間トランザクションを使ってアプリ内課金の実装をテストします。

最新の英語ドキュメント

Testing In-App Purchases with Sandbox


概要

AppleのSandbox環境では、デバイス上のStoreKitフレームワークと、App Store Connectからの実際のプロダクト情報を使ってアプリ内課金の実装をテストできます。開発用に署名されたアプリでSandbox Apple IDを使ってApp Storeにサインインすると、Sandbox環境が使用されます。

Sandbox Apple IDまたはApp Store Connectのテストアカウントを作成する方法は、「Sandboxテスターアカウントの作成」を参照してください。

Sandbox Apple IDでApp Storeにサインイン

Sandbox Apple IDを使用してアプリを実行するには、使用するデバイスおよびオペレーティングシステムに応じて、以下の操作を行います。

  • iOS 12以降の場合 — Xcodeからアプリをビルドして実行します。デバイスを使用して開発用に署名されたアプリで初めて購入する際、「設定」にSandboxアカウントが表示されます。Sandbox Apple IDを使ってサインインします。テスト用ではないApple IDからログアウトする必要はありません。

  • macOSの場合 — Mac App Storeからサインアウトしてから、Xcodeでアプリをビルドし、Finderから起動します。

アプリ内課金の購入

開発用に署名されたアプリで初めて購入する際、App Storeへのサインインを求めるメッセージが表示されます。テストを始めるには、Sandbox Apple IDでサインインします。その際に表示されるプロンプトに[Environment: Sandbox]というテキストが含まれていれば、テスト環境に接続していることがわかります。[Environment: Sandbox]と表示されない場合は、本番環境を使用していることを示しています。アプリの開発用に署名されたビルドを実行していることを確認してください。本番用に署名されたビルドは本番環境を使用します。

購入の中断のテスト

購入の中断とは、トランザクションを完了する前に、ユーザーがアプリの外で何らかの操作を実行する必要があるトランザクションのことです。たとえば、トランザクションを進めるにはユーザーが支払い方法を更新したり、新しい利用規約に同意したりする必要がある場合が該当します。

Sandboxのテストでは、App Store Connectで購入の中断機能を有効にすることで購入の中断をシミュレートできます。これは、Sandbox Apple IDテスター用に提供されている機能です。これにより、iOSデバイスで更新された利用規約に同意するか、App Store Connectでこの機能を無効にするまで、そのテスターによる購入はすべて中断されます。詳しくは、「中断された購入のテスト」を参照してください。

テストの設定

App Store Connectにサインインして、Sandbox Apple IDで購入の中断のテスト機能を有効にしてから、以下を実行します。

  1. 「ユーザとアクセス」をクリックし、サイドバーの「Sandbox」にある「テスター」をクリックします。右側にSandbox Apple IDが表示されます。

  2. 購入の中断を有効にするSandbox Apple IDを選択します。すでに有効になっている場合は、「購入の中断」列の下にチェックマークが付いています。

  3. 表示されるダイアログで、「このテスターの購入を中断する」を選択します。

テストの開始

  1. テストデバイスで、購入の中断を有効にしたSandbox Apple IDを使ってサインインします。

  2. アプリで購入またはサブスクリプションに登録するボタンを選択してアプリ内課金を購入します。

  3. システムにペイメントシートが表示されることを確認します。

  4. コードで、SKPaymentTransactionState.purchasing(英語)の状態にある新しいトランザクションがペイメントキューに入ったことを確認します。

  5. デバイスでペイメントシートを認証します。

  6. コードで、支払いが失敗したことを確認します。ペイメントキューに、状態がSKPaymentTransactionState.failed(英語)に更新されたトランザクションが入ります。

  7. コードでfinishTransaction(_:)(英語)が呼び出され、キューからトランザクションが削除されることを確認します。

  8. デバイスに利用規約が表示され、購入が中断されたことを確認します(Sandbox環境で行った構成により、このような動作になります)。

  9. デバイスでタップして、利用規約に同意します。

  10. コードで、失敗したトランザクションと同じproductIdentifier(英語)を持ち、同じ数量の新しいトランザクションが、SKPaymentTransactionState.purchased(英語)の状態でペイメントキューに入ったことを確認します。

  11. コードで、レシートを検証します。アプリで正しいサービスまたはプロダクトが提供され、finishTransaction(_:)(英語)が呼び出されることを確認します。

  12. デバイスでは、購入が正常に完了したことをユーザーに表示する必要があります。

テストの完了

App Store Connectで購入の中断を無効にするか、ユーザーがデバイスで利用規約に同意するまで、Sandbox Apple IDでは購入の中断状態が継続します。App Store Connectで購入の中断を無効にするには、このテストケースの設定と同じ手順に従い、「このテスターの購入を中断する」の選択を解除します。

サブスクリプションの管理ページからの再登録のテスト

ユーザーは、iOS、tvOS、iPadOS、およびmacOSのサブスクリプションの管理ページで、アクティブなサブスクリプションや、期限が切れてから1年以内のサブスクリプションを管理することができます。このページから、サブスクリプションをアップグレード、クロスグレード、ダウングレード、またはキャンセルすることができます。

このテストシナリオでは、デベロッパのアプリの外にあるサブスクリプションの管理ページから、期限切れのサブスクリプションに再登録します。

テストの設定

このテストケースでは、Sandbox Apple IDで期限切れのサブスクリプションを用意する必要があります。用意できていない場合は、自動更新サブスクリプションを購入してから期限切れにします。

また、App Store Connectで構成したサブスクリプションも1つ以上必要です。

テストの開始

  1. テスト用iOSデバイスで、「設定」> 「Apple ID、iCloud、メディアと購入」(iOS 13以前の場合は「Apple ID、iCloud、iTunesとApp Store」)を開きます。「Sandboxアカウント」セクションで、ハイライト表示されているSandbox Apple IDをタップし、「管理」をタップして、Sandboxのサブスクリプション管理ページを開きます。

  2. 再登録するための期限切れのサブスクリプションをタップします。App Store Connectで同じサブスクリプショングループに設定されたサブスクリプションプロダクトが表示されます。

  3. 再登録するサブスクリプションプロダクトをタップして選択します。ペイメントシートが表示されることを確認します。

  4. ペイメントシートを認証して購入を完了します。

  5. アプリを開きます。

  6. コード内のSKPaymentTransactionObserver(英語)で、SKPaymentTransactionState.purchased(英語)の状態のトランザクションが含まれるpaymentQueue(_:updatedTransactions:)(英語)のコールバックがあることを確認します。

  7. コードでアプリのレシートが取得され、検証されたことを確認します。レシートに正常なトランザクションが含まれていることを確認します。

  8. コードで、アプリのアプリ内課金が利用できるようになり、サブスクリプション登録者のステータスが更新されたことを確認します。

  9. コードで、finishTransaction(_:)(英語)が呼び出されたことを確認します。詳しくは、トランザクションを終了する(英語)」を参照してください。

テストの完了

このテストケースでは、クリーンアップの必要はありません。自動更新サブスクリプションの場合は、サブスクリプションの期限が切れたときにテストを再実行できます。

自動更新の無効化のテスト

ユーザーは、iOS、tvOS、iPadOS、およびmacOSのサブスクリプションの管理ページで、アクティブなサブスクリプションや、期限が切れてから1年以内のサブスクリプションを管理することができます。このテストシナリオでは、ユーザーがサブスクリプションをキャンセルし、それによって自動更新が無効になります。

このテストを設定するには、Sandbox Apple IDアカウントで自動更新サブスクリプションを購入します。

テストの開始

  1. テスト用iOSデバイスで、「設定」> 「Apple ID、iCloud、メディアと購入」(iOS 13以前の場合は「Apple ID、iCloud、iTunesとApp Store」)を開きます。「Sandboxアカウント」セクションで、ハイライト表示されているSandbox Apple IDをタップし、「管理」をタップして、Sandboxのサブスクリプション管理ページを開きます。

  2. キャンセルするサブスクリプションプロダクトをタップして選択します。

  3. 「サブスクリプションをキャンセルする」ボタンをタップします。

次に、以下の2つの方法のいずれかを使って、サブスクリプションステータスの変更を確認します。

  • App Store ConnectでApp Storeサーバ通知を受信するよう設定している場合、サブスクリプションの自動更新ステータスが変更されるたびに、サーバにnotification_type(英語) DID_CHANGE_RENEWAL_STATUSが送信されます。詳しくは、「App Storeサーバ通知の有効化」を参照してください。

  • 最新のレシートを使ってverifyReceipt(英語)を呼び出し、レシートを検証します。JSON応答に含まれるpending_renewal_infoオブジェクトに、現在の状態が0に変更されたauto_renew_statusが含まれています。auto_renew_status_change_date_msには、変更のタイムスタンプが含まれています。

サブスクリプション更新の再有効化のテスト

同上のサブスクリプションの管理ページでサブスクリプションを再有効化して、自動更新の無効化と逆の操作をテストします。更新するサブスクリプションをタップします。

プロダクトIDのフェッチのテスト

プロダクトIDをアプリに埋め込む場合は、コード内でIDを読み込む部分の直後にブレークポイントを設定します。NSArray(英語)のインスタンスに、プロダクトIDのリストが予定通りに含まれていることを確認します。

アプリがサーバからプロダクトIDをフェッチする場合は、Safariなどのウェブブラウザや、curlなどのコマンドラインユーティリティを使って、JSONファイルを手動でフェッチします。サーバが返すデータにプロダクトIDのリストが予定通りに格納されていること、サーバにHTTPの標準キャッシュメカニズムが正しく実装されていることを確認します。

無効なプロダクトIDの処理のテスト

アプリのプロダクトIDのリストに無効なIDを意図的に含め、以下のいずれかを行います。

  • 本番用のビルドで、アプリにストアUIの無効なID以外の部分が表示され、ユーザーが有効なプロダクトを購入できることを確認します。

  • 開発用ビルドで、アプリの問題について注意が喚起されることを確認します。

コンソールログをチェックして、無効なプロダクトIDが正しく識別されていることを確認します。テスト後に削除するのを忘れないようにしてください。

プロダクトリクエストのテスト

テストしたプロダクトIDのリストを使用して、SKProductsRequest(英語)のインスタンスを作成して送信します。コードにブレークポイントを設定し、プロダクトIDが有効なリストと無効なリストを検査します。無効なプロダクトIDがあった場合は、App Store Connectでプロダクトを確認して、JSONファイルまたはプロパティリストを修正します。

支払いリクエストのテスト

既にテスト済みの有効なプロダクトIDを使用してSKPayment(英語)のインスタンスを作成します。ブレークポイントを設定して、支払いリクエストを検査します。トランザクションキューに支払いリクエストを追加し、ブレークポイントを設定してオブザーバのpaymentQueue(_:updatedTransactions:)(英語)メソッドが呼び出されることを確認します。

テスト中は、コンテンツを提供せずに直ちにトランザクションを終了しても構いませんが、トランザクションの終了に失敗すると問題が発生することがあります。終了していないトランザクションはキュー内に残るため、後で行うテストに影響することがあります。

オブザーバコードの検証

トランザクションオブザーバのSKPaymentTransactionObserver(英語)プロトコルの実装を確認します。アプリのストアUIが表示されておらず、また最近購入を行なっていない場合であっても、オブザーバがトランザクションを処理できることを確認します。

コードでSKPaymentQueue(英語)add(_:)(英語)メソッドが呼び出されている場所を特定します。アプリの起動時にこのメソッドが呼び出されていることを検証します。

成功したトランザクションのテスト

Sandbox Apple IDでApp Storeにサインインして、アプリで購入を行います。トランザクションキューのオブザーバのpaymentQueue(_:updatedTransactions:)(英語)メソッドの実装にブレークポイントを設定し、トランザクションを検査して、その状態がSKPaymentTransactionState.purchased(英語)であることを確認します。

コードで購入を持続させる箇所にブレークポイントを設定し、購入が成功したときにこのデータが持続していることを確認します。ユーザーデフォルトまたはiCloudキー値ストアを検査して、コードで正しい情報が記録されていることを確認します。

トランザクションが終了したことの確認

アプリでfinishTransaction(_:)(英語)メソッドが呼び出されている場所を特定し、このメソッドが呼び出される前に、トランザクションに関連するすべての処理が完了していることを確認します。成功か否かにかかわらず、すべてのトランザクションでこのメソッドが呼び出されることを確認します。詳しくは、「トランザクションを終了する(英語)」を参照してください。

App Storeサーバ通知のテスト

アプリでApp Storeサーバ通知を有効にした場合は、Sandbox環境でトランザクションのロジックをテストします。テスト環境でサブスクリプションイベントの通知が発生したかどうかを特定するには、サーバ間のJSON responseBody(英語)オブジェクトのenvironmentフィールドの値が、Sandboxと同じであることを確認します。

App Storeサーバ通知のフィールドについて詳しくは、「App Storeサーバ通知(英語)」を参照してください。

自動更新サブスクリプションのテスト

自動更新サブスクリプションの動作は、テスト環境と本番環境で異なります。

テスト環境では、更新期間が短縮され、自動更新サブスクリプションが初回購入以降に最大5回更新されます。これにより、サブスクリプションの更新、サブスクリプションの失効、サブスクリプションの期間に間隔があるサブスクリプション履歴がアプリでどのように処理されるかをテストできます。Sandbox環境内でのサブスクリプション期間の一覧については、「アプリ内課金のテスト」を参照してください。

テスト環境では更新と期限切れの頻度が増しているために、システムがサブスクリプションの更新を実行しようとする前に、サブスクリプションが期限切れになる場合があります。これによって、サブスクリプションの期間に短い間隔が生じます。本番環境でも、さまざまな原因でこのような間隔が生じることがあります。アプリでこれらを正しく処理できることを確認してください。

関連項目

アプリ内課金のテスト