これは古いトピックであることは知っていますが、解決策を見つけるのに苦労し、解決策が見つかるまで試行錯誤を繰り返したので、他の場所で見つけることができなかったので、ここで共有すると思いました.
まず、呼び出したトランザクションごとに次のことを確認してください。
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
私の場合、トランザクションが完了せずキューに残っていたため、別のサンドボックス アカウントに切り替えても、古いアカウントのパスワードを要求し続けました。
それを修正するために追加しました:
SKPaymentQueue *queue = [SKPaymentQueue defaultQueue];
for (SKPaymentTransaction *transaction in queue.transactions) {
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
トランザクション オブザーバーを追加する前に、つまり次のようにします。
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
また、
(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
関数に、次のコード行を追加しました。
[queue finishTransaction:transaction];
switch ステートメントの SKPaymentTransactionStateRestored および SKPaymentTransactionStateFailed ケース。私が知っていることから、それを終了することは許可されていないため、購入済みの状態に追加しないでください。
上記の 2 つの手順のどちらでバグが修正されたのかわかりません。iPhone からサインアウトし、アプリを削除し、電源を切り、クリーンな再構築/インストールを実行して、パスワードの入力を求めるのを最終的に停止するまでバグが持続したためです。盗まれたアカウント。これが誰かに役立つことを願っています。
編集: (11/12/15)
というわけで、サンドボックスアカウントが壊れる原因を突き止めました。購入を復元してからホームキーを押し、再度開いて復元ボタンをもう一度押すと、クラッシュが発生しました。復元はキューに残り、上記のプロセスがパスワードを要求するポップアップから抜け出す唯一の方法でした。
それを止めるために、私は追加しました:
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
アプリ内購入マネージャー オブジェクトを nil する前に、メイン ビュー コントローラーの TearDown 関数 (applicationDidEnterBackground: によって呼び出されます) によって。何が起こっていたのかと思うと、オブジェクトをトランザクション オブザーバーとして複数回追加したため、奇妙な動作が発生していました。見たところ、エラーを再現できていないため、問題は完全に修正されたようです。