消費不可のアプリ内購入がある基本的なアプリの場合、誰でもSKPaymentQueueのrestoreCompletedTransactions
を使用するためのベストプラクティスを理解していますか?
アプリに戻る保留中のトランザクションを受信するには、常にトランザクションオブザーバーを登録することをお勧めしますが、これは別の質問です。 restoreCompletedTransactions
は、顧客がすでに行ったすべての購入をポーリングするために呼び出すタイミングをアプリが積極的に決定する必要があるもののようです。
私の知る限りでは、この方法は、失われた可能性のある購入を取得するように設計されています。たとえば、以前の支払いのアプリのローカルレコードが失われたりリセットされたりするような方法で、顧客がアプリをインストールまたは新しいデバイスに移動したとします。
私にとって明確ではないのは、この状態を自動的に検出する方法(つまり、欠落している購入をポーリングするタイミングを決定する方法)です。私はこれを台無しにしたくないし、顧客がすでに支払った機能へのアクセスを拒否するリスクを冒したくない。
同時に、アプリを起動するたびにrestoreCompletedTransactions
を呼び出さずに済みます。これは、安全を確保し、基本的には、すでに99.9%の確率でわかっているトランザクションを取り戻すためです。 (アプリ内購入を除いて、私のアプリは実際にはネットワーク接続を必要としません。)
Appleのドキュメントでは、お客様が既に行った非消耗品の購入に対して再度請求されることはないことが明記されています。彼らが再購入しようとした場合でも、支払い取引は引き続きアプリに送信されると考えられます。
最悪の場合、お客様はこの方法で購入を取り戻すことができますが、すでに支払い済みのものを再購入するような経路をたどらないようにしたいと思います。
Appleの このトピックに関するドキュメント は2018年に更新され、非常に包括的です。その推奨事項の多くは、私たちが最終的にここで理解した結果と一致しています。この質問が2009年に最初に投稿されてからの最大の進展は、iOS 7のApp Storeレシートです。
リンクが将来のある時点で古くなった場合に備えて、ここでドキュメントの一部を引用します。
購入した製品の復元
ユーザーはトランザクションを復元して、すでに購入したコンテンツへのアクセスを維持します。たとえば、新しいスマートフォンにアップグレードしても、古いスマートフォンで購入したすべてのアイテムが失われることはありません。アプリにいくつかのメカニズムを組み込んで、ユーザーが購入を復元できるようにします([購入を復元]ボタンなど)。購入を復元すると、ユーザーのApp Store認証情報の入力を求められ、アプリのフローが中断されます。このため、特にアプリが起動されるたびに、自動的に購入を復元しないでください。
ほとんどの場合、アプリが行う必要があるのは、レシートを更新し、レシートで製品を配達することだけです。更新されたレシートには、このデバイスまたは他のデバイスでの、このアプリでのユーザーの購入の記録が含まれています。ただし、一部のアプリは、次のいずれかの理由で代替アプローチをとる必要があります。
- Appleがホストするコンテンツを使用している場合、完了したトランザクションを復元すると、コンテンツのダウンロードに使用するトランザクションオブジェクトがアプリに提供されます。
- アプリの領収書を入手できないiOS 7より前のバージョンのiOSをサポートする必要がある場合は、代わりに完了したトランザクションを復元してください。
- アプリが非更新サブスクリプションを使用している場合、アプリは復元プロセスを担当します。
レシートを更新すると、App Storeに最新のレシートのコピーが要求されます。領収書を更新しても、新しいトランザクションは作成されません。連続して複数回更新することは避けなければなりませんが、このアクションは1回だけ更新するのと同じ結果になります。
完了したトランザクションを復元すると、ユーザーが完了したトランザクションごとに新しいトランザクションが作成され、基本的にトランザクションキューオブザーバーの履歴が再生されます。トランザクションが復元されている間、アプリは独自の状態を維持して、完了したトランザクションを復元する理由と、トランザクションの処理方法を追跡します。複数回リストアすると、完了したトランザクションごとに複数のリストアされたトランザクションが作成されます。
質問を書き、それについて考えた後、私はいくつかの解決策を思いつきました。
1つのオプションは、restoreCompletedTransactions
がアプリでまだ呼び出されている(正常に完了している)かどうかをユーザーのデフォルトに記録することです。そうでない場合、アプリは起動時に一度呼び出します。このフラグは非消費型支払いと同じ場所に保存できるため、ユーザーのデフォルトが後でワイプされると、アプリの起動時に復元メソッドが再度呼び出されます。
このように、既存の衣装担当者が何らかの方法でアプリの新規インストールを行っている場合でも、購入は自動的に復元されます。これまでにアプリを起動したことがない新規顧客の場合、復元操作は何も返しません。
どちらの場合でも、restoreCompletedTransactions
は、起動のたびにではなく、一度だけ呼び出されます。
別のオプションは、顧客に「購入を復元」ボタンをどこかに提供し、それをrestoreCompletedTransactions
に接続して、それが必要かどうか、いつ必要かを決定することです。
(以下のコメントは、手動での復元が自動的に行うよりもおそらく優れている理由を説明しています。)
1つのApple IDは複数のデバイスにまたがることができることを忘れないでください。そのため、1つのデバイス(たとえば、ユーザーのiPhone)にフラグを維持すると、復元を実行したかどうかを通知しますお客様がiPhoneに復元する必要がある別のデバイス(iPadなど)で購入したかどうかを検出することはできません。したがって、自動メソッドを使用している場合でも、手動で復元を起動する方法も必要です。
さらに悪いことに、IAPの払い戻しが行われたときにどのように通知されるかはまだわかりません。復元プロセスでは、払い戻しされなかったトランザクションのリストが返されるだけだと思います。したがって、a)復元中に返金された製品が単に報告されない場合に備えて、復元を実行するときにユーザーのIAPの記録を削除する必要があります。b)払い戻しを受け取るために定期的に自動的に復元する必要があります。
これはすべて、AppleのIAPの問題を浮き彫りにします-十分に考え出されておらず、文書化も不十分です-そして今では、アプリ(Kindleなど)ですでに完全に機能しているWebベースのストアを既に持っている電子ブックリーダーなどのコンテンツプロバイダーに必要です。
新しいレーストラックなど、消費不可のアプリ内購入がある場合は常に、ユーザーがデバイスを変更したりアプリを削除したりした場合にユーザーが購入を復元できるように、アプリのどこかに「復元」ボタンを実装する必要があります。これは必須であり、Apple以前は[復元]ボタンを実装しないためにアプリを拒否していました。