アプリケーションでアプリ内購入の追加のレシート検証を実装しました(https://developer.apple.com/library/ios/#releasenotes/StoreKit/IAP_ReceiptValidation/_index.htmlに触発されました)。したがって、SKPaymentTransactionStatePurchasedを取得した後、この検証を実行し、成功すると、ゲームの新しいコンテンツのロックを解除し、最後に、
[[SKPaymentQueue defaultQueue] finishTransaction:myTransaction];
インターネット接続障害のために検証プロセスを終了できない場合、またはユーザーが検証プロセス中にアプリケーションを終了した場合はどうなりますか?この場合、コンテンツのロックを解除せず、トランザクションを完了しません。そして、それはかなり論理的だと思います。
ただし、(「未完了のトランザクション」状態で終了した)アプリケーションを再起動してアプリ内を購入しようとすると、transaction.error.code==SKErrorPaymentCancelledでSKPaymentTransactionStateFailed状態になりました。また、次のようなメッセージボックスが表示されました。
「このアイテムは既に購入済みですが、まだロードされていません。[OK]をタップして今すぐロードしてください。」
「OK」を押した後、コールバックが呼び出されないため、コンテンツのロックを解除しませんでした。
だから私の質問は次のとおりです:1)トランザクションを未完了の状態のままにしておいても大丈夫ですか(検証できない場合)?2)そしてどうすればそれを復元できますか?「あなたはすでに購入しました...」というメッセージボックスに付随するコールバックがないのではないでしょうか。
PS私のアプリ内購入は「消耗品」です。だから使えない
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];