私のアプリの説明
私のアプリには 1000 種類のアイテムが含まれています。それらはすべて、インストールされたパッケージの一部です (インストールの完了後にロードする必要はありません)。項目は 1 つずつ表示されます。最初の 50 アイテムは無料です。残りは、ユーザーが非消費型アプリ内製品を購入した場合にのみ利用できます。
製品が購入されたかどうかをアプリが認識する方法
アプリが起動すると、製品が購入された場合、キーチェーン (この情報を保存する場所) が検索されます。の場合YES
、アプリの InApp-Payment-screen は表示されず、すべての機能が完全に利用可能です。(以降の参考のために、これを「ケース 0」と呼びます)。
キーチェーンにこの情報が含まれていない場合、次の 2 つのいずれかを意味する可能性があります。
ケース 1
ユーザーは製品の代金を支払いませんでした (このデバイスでも他のデバイスでも)。この場合、50 番目のアイテムの後に InApp-Payment 画面を表示する必要があり、そこでユーザーは追加の 950 アイテムに対して支払いを行うか、または 50 の無料アイテムで十分かを判断できます。
ケース 2
ユーザーは既に製品を購入しています (別のデバイスで、またはリセットされる前のこのデバイスで、または ...)。この場合、 に電話することで、以前に購入した製品の製品 ID を受け取ります[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]
。それを受け取ると、productID がキーチェーンに保存され、アプリはケース 0 とまったく同じように動作するはずです。これは、ユーザーが 50 番目のアイテムに到達したときに、何か特別なものがあることに気付かないことを意味します。彼はアプリを使い続けて、アイテム 51 とその後の他のすべてのアイテムを見ることができます。InApp-Payment 画面は決して表示されるべきではなく、ユーザーにはすべてのアイテムへのフル アクセスが許可されている必要があります。
私が想像できる限り、ケース 1 と 2 を区別する方法は 1 つしかありません。両方のケースのどちらが真であるかを調べる唯一の方法は、50 番目の項目に到達するrestoreCompletedTransactions
前に呼び出すことです。呼び出しで productID が返された場合はケース 2、そうでない場合はケース 1 です。ケース 2 が true の場合、支払いダイアログを表示してはならないため、ユーザーが 50 番目のアイテムに到達する前にこの呼び出しを行う必要があります。
パスワードプロンプトの問題
しかし、ここで問題が発生します。アプリが呼び出すとrestoreCompletedTransactions
、ユーザーは自分の Apple ID のパスワードの入力を求められます。しかし、ユーザーはプロンプトが表示される理由を確認できません。なぜなら、この呼び出しをバインドしたアイテムに応じて、アプリを起動したばかりか、アイテム #49 を見ているだけだからです (これは、48 と比較して特別なことではありません)。前のアイテム) または彼は #49 の前のアイテムの 1 つを見ています。
ここで、支払いたくないユーザーを想像してみてください。たぶん、彼は自分のデバイスの InApp-Payment を無効にしたことさえあります。しかし、彼がアプリを使用して特定のアイテム (非常に目立たないアイテム #37 としましょう) にたどり着くたびに、パスワードの入力を求められます。私がこのユーザーだったら、アプリにバグがあるか、パスワードをスパイしようとしていると思います。
私の要求
ユーザーを疎外することなく、このユースケースに対処する方法を教えてください。
ところで、場合にのみ
呼び出しを行うのは悪い考えです。そうする場合、以前に(おそらく他のデバイスで)製品を購入し、現在このデバイスで設定しているユーザーは、すでに支払った製品を消費する機会がありません. また、ユーザーが設定した場合は役に立ちませんrestoreCompletedTransactions
[SKPaymentQueue canMakePayments]
YES
InApp-Payment = OFF
InApp-Payment = ON