購入したプロダクトの復元

ユーザーは購入済みのコンテンツに引き続きアクセスするためにトランザクションを復元します。たとえば、新しい携帯電話にアップグレードする場合、古い携帯電話で購入したアイテムはいずれも失われません。「Restore Purchases」ボタンなど、ユーザーが購入を復元できる仕組みをAppに組み込んでください。購入の復元では、ユーザーのApp Storeクレデンシャルが求められ、Appのフローが中断されます。そのため、(特にAppが起動されるたびに)購入が自動的に復元されるようにはしないでください。

ほとんどの場合、Appで必要な処理は、レシートの更新とレシートに含まれるプロダクトの配信のみです。更新されたレシートには、このデバイスまたはほかのデバイス上においてユーザーがこのAppで行った購入記録が含まれています。ただし、Appによっては、次のような理由から別の方法を取る必要があります。

レシートを更新すると、App Storeにレシートの最新コピーが要求されます。レシートを更新しても、新しいトランザクションは作成されません。何度も続けて更新することは避けるべきですが、この操作は1回だけ更新するのと同じ結果をもたらします。

完了したトランザクションを復元すると、ユーザーが完了したトランザクションごとに新しいトランザクションが作成され、トランザクションキューのオブザーバの履歴が再現されます。トランザクション復元中、Appは完了したトランザクションを復元している理由と処理方法を把握するために状態を維持します。何度も復元すると、完了したトランザクションごとに復元したトランザクションが複数作成されます。

再ダウンロードできるコンテンツについて、適切なレベルのコントロールをユーザーに提供します。たとえば、日刊の新聞を3年分、数百メガバイト分のゲームレベルをまとめてダウンロードすることは避けてください。

Appレシートの更新

レシート更新要求を作成し、デリゲートを設定して、要求を開始します。要求では、期限切れのレシートなど、テスト中のさまざまな状態のレシートの取得のためのオプションのプロパティがサポートされます。詳細については、SKReceiptRefreshRequestinitWithReceiptProperties:メソッドの値を参照してください。

request = [[SKReceiptRefreshRequest alloc] init];
request.delegate = self;
[request start];

レシートの更新後、そのレシートを確認し、追加されているプロダクトを配信します。

完了したトランザクションの復元

AppはSKPaymentQueuerestoreCompletedTransactionsメソッドを呼び出すことでプロセスを開始します。Appのすべての完了したトランザクションを復元するため、App Storeに要求を送信します。Appが支払い要求のapplicationUsernameプロパティに値を設定している場合(「異常アクティビティの検知」を参照)、restoreCompletedTransactionsWithApplicationUsername:メソッドを使用してトランザクション復元時と同じ情報を提供します。

以前に完了したトランザクションごとに、App Storeが新しいトランザクションを生成します。復元されたトランザクションには、元のトランザクションへの参照が含まれています。SKPaymentTransactionのインスタンスにはoriginalTransactionプロパティがあり、レシートのエントリには「オリジナルのトランザクションID」フィールドがあります。

トランザクションキューのオブザーバは復元された各トランザクションのSKPaymentTransactionStateRestored状態で呼び出されます。これについては、「App Storeがトランザクションを処理するまでの待機」で説明します。この時点での対応は、Appの設計によって異なります。