目次
Session概要
App Storeサーバに接続することなく、ローカル環境でアプリ内課金のテストを行うStoreKit Testing in Xcodeを紹介します。テスト環境をセットアップし、StoreKitのコンフィグレーションファイルを作成し、レシートをローカルで検証する準備を整える方法について説明します。
さらに、様々なアプリ内課金のシナリオをテストし、StoreKitTestフレームワークでそれらのテストを自動化する方法を説明し、Sandbox環境でのテストに関する最新の改良点を紹介します。
https://developer.apple.com/videos/play/wwdc2020/10659/
IAPの開発ライフサイクル
- 以前までは、アプリにIAPを組み込む際にはApp Store Connectで製品登録を行い、Sandboxアカウントを用意し、StoreKitを用いてIAPの処理プログラムを実装する必要があった


Xcode 12でのStoreKitテスト機能
- StoreKitとアプリ内課金に特化したテストフレームワークの追加
- これにより、アプリのIAPを完全にローカルで構築してテスト可能
- Xcodeに統合されており、アプリの開発ワークフローと切れ目なくつながっている
- StoreKitテストフレームの導入
- StoreKit統合についてテストを完全に自動化可能
- これにより、StoreKitの開発ライフサイクル全体が変わる
- 今後はApp Store Connectを起動する代わりにXcodeの中でStoreKit統合の構築とアプリの他の部分の構築を同時に行うことができる
- また、UIおよびその他の自動化テストでアプリのStoreKit統合を確実に高品質なものにできる
- その後で、App Store Connectにサインインして、Sandbox環境を使うことができます


Xcode 12のStoreKitテストの詳細
StoreKit設定ファイルについて
- StoreKitは初期設定ではSandbox環境を使用するため、Xcode内のローカルテストを使用可能にする必要がある
- プロジェクトのアプリ内プロダクトを定義する必要がある
- 設定ファイルには消耗型、非消耗型、自動更新サブスクリプションを設定可能
- 設定ファイルで定義するProduct IDはアプリがStoreKit APIへ渡す値と合っていなくてはならない
- 名前や価格は自由に設定可能
- 家族間共有を有効・無効の設定が可能
- ローカライズ設定
- 製品名と説明をロケール毎に設定可能
- Sandbox環境ではなく、StoreKit設定ファイルを利用するにはアプリ起動時にStoreKit設定ファイルを参照させるように設定する必要がある
- Schemeの編集から、Run → Optionsで、StoreKit Configuration から作成した設定ファイルを参照するようにする
- StoreKit設定ファイルはインタラクティブに操作でき、再コンパイル、再起動を必要なしで名前や価格の変更が可能
- 自動更新サブスクリプションの場合
- サブスクリプション期間やサブスクリプションオファーなどの設定も可能
- サブスクリプション更新処理の確認
- サブスクリプション設定ファイルにて、Time Rateを選択し、1日を1秒として扱ったりすることが可能
- サブスクリプション設定ファイルにて、Time Rateを選択し、1日を1秒として扱ったりすることが可能




StoreKit設定ファイルを用いたIAPテスト方法
- 上記でStoreKit設定ファイルの設定が完了したら、アプリ起動してIAPが実行可能
- IAPの実行時はAppleサインインや認証も不要
- Sandboxや本番環境と同様に、購入後はアプリの支払いトランザクションオブザーバーが更新される
- アプリが確認できるように、レシートも発行される
Xcode 12でのStoreKit Transaction Manager
- 購入済みの非消耗型製品などを再度未購入状態に戻す場合などが簡単に可能
- ローカルテスト環境で行った全ての購入を見ることが可能で、完全に制御することができる
- 返金のシミュレーションも可能

- 子供用のアプリなどで、製品購入前に確認フローをはさみたいケースがある
- StoreKitテストではAsk to Buyをサポートしており、StoreKit設定ファイルからAsk To Buyを有効化することで実現可能
- アプリ内で購入したコンテンツの認証ができるようにするために、App Storeではデジタル署名付きレシートを提供している
- レシートはアプリ内で当該ユーザが購入したという信頼できる記録
- デバイスに保存されて、システムによって自動的に更新される
- 署名付きなので、App Storeから来たものということが確実にわかる
レシート検証
- ローカルのレシートはSandboxや本番環境で生成されるレシートに使用されるものとは異なるプライベートキーで署名されている
- 確認の際には、別の証明書を使用する必要がある
- StoreKitテスト証明書をStoreKit設定ファイルのエディターメニューを通じて、プロジェクトにエクスポートする便利な方法を提供している
- StoreKitテスト証明書は証明書チェーンに参加していない
- そのため、クライアントの確認プログラム内でデバッグマクロを利用してプログラムがStoreKitTest証明書とAppleIncRoot証明書のどちらを選択するかをわける
- また、クライアント側のレシート確認にOpenSSLを使用している場合Debugする時だけ
PKCS7_NOCHAIN
引数を使用する

StoreKitTest フレームワークの追加
- 完全なローカルテスト環境をプログラム内でコントロールできるようになった
- StoreKitTestはアプリ内課金のUnit/UIテスト対象を拡大するためにXCTestと共同して動作する
- ユーザインタラクションが必要な、シートやダイアログも無効にすることができる
- SKTestSession.disableDialogsをtrueに設定することでユーザの入力なしで最後までテストが実行できるようになる
- 即座にサブスクリプションの更新トリガーを起動することができる
- 設定ファイルはSKTestSessionから参照する
- SKTestSession.clearTransactionで過去のトランザクション削除することができる
Sandbox環境とlocalテスト環境での違い
- Sandboxでは、
- App Store Connectでアプリ内課金を設定する
- Sandbox Apple IDを作成する
- すべてのレシートはApp Storeによって署名される
- サーバ側レシート検証、App Storeサーバ通知もサポートしている
- iOS 14では、アプリ内課金やSandbox内のサブスクリプションのテストが簡単になった
- 新しい管理オプションを選択すると、新しいSandbox 管理サブスクリプションページが開く
- このページで、Sandbox内のサブスクリプションを確認してテストできる
- サブスクリプションのお試し価格昨日について、対象者かどうかをリセットできる


