2013-11-21 17 views
12

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つのシステムバージョンすべてで、これはシミュレータではなく、実際のハードウェア上で実行されています。

+0

私はちょうどテスト番号2)。何の購入が含まれていないリフレッシュする前に、空でない領収書がある場合、それはリフレッシュした後**異なる**空でない領収書となります。または、少なくとも私が作った2つの試みではそうだった。もちろん、これに対するより直接的な解決策は良いでしょう。たとえば、ユーザーがキャンセルを押したことを示すために呼び出された削除メソッド。バイト単位、5515バイト、5522のバイトは、私が行った試験では領収書の間で異なっていました。 –

答えて

1

のiOS 9.2.1、Xcodeの7.2.1、ARCは、私はあなたが2年前にこれを尋ねたが、私は最近、私のこの問題で実行し、解決策を発見した、と共有したいと思っ理解

を有効にここでは他の人が時間を節約することができます。

1)領収書をキーチェーンに保管してそのコピーにアクセスすることを選択できます。これを削除するか、適切に表示するように更新することができます。

2)うん、あなたは間違いなくそれが変更された場合、私はそれを行うための最も簡単な方法は、使用するのだと思う確認することができます。

[receipt isEqualToData:(NSData *)(copyReceiptObject)] 

次のように私の提案は次のとおりです。

キーあなたが方法から得るを期待することです:

- (void)request:(SKRequest *)request didFailWithError:(NSError *)error;

ユーザーのタップは対話でログイン後、キャンセルするときに呼び出される

は、iTunes Storeにサインインするアップします。

エラー:iTunesに連絡が無い場合

を:そこに多くのカスタム結果は変更になる場合がありますので、あなたは、リフレッシュ要求を行うことができたですが、ここにあなたが私の要求のために取得する別のエラーですドメイン= SSErrorDomainコード= 110は= NSURLErrorDomain コード= -1009 NSUnderlyingError = 0x13c76d680 {エラードメインは、「iTunes Storeに接続できない、iTunes Storeに接続できない= のUserInfo = {NSLocalizedDescription "iTunes Storeに接続できません" " のUserInfoが= {NSLocalizedDescriptionは= NSErrorFailingURLStringKey =

{ここにあなたの製品IDと対応するURI}

、_kCFStreamErrorCodeKey = 8、_kCFStreamErrorDomainKey = 12、 NSLocalizedDescription =インターネット接続が表示され、iTunes Storeに接続できませんユーザのタップをキャンセルするとオフライン}}}

すべき:

エラードメイン= SSErrorDomainコード= 16 "iTunes Storeに接続できません" のUserInfo = {NSLocalizedDescription = iTunes Storeで、 に接続できませんNSUnderlyingError = 0x13c6ac7b0 {エラードメイン= AKAuthenticationError コード= -7003「(ヌル) "}}

私が考える最も簡単では、より複雑な取得したい場合は、エラーの詳細を取得するには、完全なエラー文字列を解析するために選択することができ、error.codeをチェックすることです。私の場合

、全く接続エラーコードは110せず、ユーザがキャンセルした場合にエラーコードでログは16あります。エラーを処理します。上記

+0

私はこれらのエラーについてさらに知りたいと思っており、SSErrorDomainについてのフォローアップの質問をhttp://stackoverflow.com/q/35851069/4018041で尋ねました。 –

+0

私はこのようなエラーコードを使用することがどれほど信頼できるか分かりませんが、2017年1月現在、キャンセルを押してもエラーコード16が返されています。 – Richard

+0

全く信頼できませんが、これを検出する他の方法はわかりませんが、これはユーザーエクスペリエンスを向上させるために検出する望ましい条件です。それが動作することを確認していただきありがとうございます。 –

関連する問題