iOS7レシートを更新する必要がある場合は、SKReceiptRefreshRequestを使用するのが適切な方法です。これにより、Apple IDを使用してサインインするためのAppleダイアログが表示されます。また、キャンセルすることもできます。 ユーザーがキャンセルを押した場合、どのように検出できますか?(もちろん、iOS6ではcatching the cancel event for [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]を使用してこれを行うことができます)。ユーザーが行うか、キャンセルを押していない場合requestDidFinishデリゲートメソッドが呼び出された私のコードではSKReceiptRefreshRequestをキャンセルしてサインインするユーザーを検出する
- (void)requestDidFinish:(SKRequest *)request;
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error;
:
SKReceiptRefreshRequestオブジェクトは、次の2つのメソッドを持つデリゲートを持っています。
これが私にとって重要な理由は、ユーザーがキャンセルを押した場合に復元処理をキャンセルしたいということです。リフレッシュ要求後にレシートが存在しない場合は、比較的簡単です。しかし、SKReceiptRefreshRequestの前にアプリ内にレシート(一部の購入品あり)が表示されることもあります。そのため、ユーザーがサインインダイアログからキャンセルすると、アプリに残ります。
1)リフレッシュ要求に先立って、バンドルからレシートを削除します。
は、私がこれを行う方法には2つのアイデアを持っています。明らかな問題は、アプリがバンドルからファイルを削除できないことです(例:Delete file from bundle after installを参照)。私は試した。いいえ。
2)リフレッシュ要求前と受信後の領収書のバイトを確認します。これらが異なる場合は、ユーザーが「キャンセル」を押さなかったことを示すはずです。違いがない場合は、はと表示されていますか?領収書に購入が含まれている場合は、リフレッシュされた領収書に異なるトランザクションID(同じ「元のトランザクションID」)が必要なため、バイトが異なると思われます。領収書に購入が含まれていない場合、私はそれについては分かりません。
更新、11/9/15;私は、キャンセルを押したユーザーに対する代理人の応答が変更されたように見えることに気付きました。今、でした.FailWithRerrorが呼び出されました。しかしながら、ユーザのキャンセルを検出する問題は依然として残っている。キャンセルを押したユーザーと本物のエラーを区別するにはどうすればよいですか?私はiOS8.4とiOS9.2(ベータ版)でテストしています。私は、この区別性の欠如をAppleにバグとして報告しました(バグ#23476210)。
更新、11/10/15;この問題は、ではなく、がiOS 9.0.2で表示されます。私はちょうど同じおおよその時間間隔(3つのすべてのシステムの20分以内)で、同じアプリバイナリで3つのシステムすべてでこれを試しました:(A)iOS9.2(13C5050d):問題が発生しました(didFailWithErrorが呼び出されます(B)iOS9.0.2、問題は発生しない(requestDidFinishが呼び出されます)、(C)iOS8.4.1、問題が発生します。 3つのシステムバージョンすべてで、これはシミュレータではなく、実際のハードウェア上で実行されています。
私はちょうどテスト番号2)。何の購入が含まれていないリフレッシュする前に、空でない領収書がある場合、それはリフレッシュした後**異なる**空でない領収書となります。または、少なくとも私が作った2つの試みではそうだった。もちろん、これに対するより直接的な解決策は良いでしょう。たとえば、ユーザーがキャンセルを押したことを示すために呼び出された削除メソッド。バイト単位、5515バイト、5522のバイトは、私が行った試験では領収書の間で異なっていました。 –