8

アプリ内購入に StoreKit を使用しています。ユーザーが [キャンセル] ボタンを押したときの API の動作が風変わりであることがわかりました。

たとえば、「アプリ内購入の確認」画面でキャンセルを押すと、期待どおりにSKPaymentTransactionStateFailed取引が行われます。error.code == SKErrorPaymentCancelled

しかし、[購入] を押してから [キャンセル] を押すと、Failedトランザクションが発生しerror.code == 0ます。「error.localizedDescriptioniTunes Storeに接続できません」は明らかに嘘です。

すべてのトランザクションを無視できるキャンセルとして扱いたくなるかもしれませんが、機内モードでデバイスがオフラインの場合、アラート ポップアップなしでトランザクションが発生Failedすることも明確にわかります。Failedその場合、ユーザーに問題を説明するように通知する必要があります。

MKStoreKitは、すべての失敗がキャンセルであると想定していることに注意してください。MKStoreManagerfailedTransactionメソッドが呼び出されることはありません。常にすべてのトランザクションMKStoreObserverを呼び出します。コメントはのエラー メッセージを推奨していませんが、これは理にかなっていますが、キャンセルされていないトランザクションについてユーザーに通知するのは誰でしょうか?transactionCanceledFailedMKStoreManager.htransactionCanceledFailed

これらの障害を処理するためのベスト プラクティスは何ですか? エラーを飲み込むべきですか?冗長であっても、常にエラーを表示しますか?

4

5 に答える 5

11

私たちはモバイル接続を介してものを購入するかなりのユーザーベースを持っており、アラートのみを表示します

code != SKErrorPaymentCancelled && code != SKErrorPaymentNotAllowed

どうやら、それはあなたができる最善のことです。また、あなたが言及しているキャンセル時の奇妙な動作も見ました。これは、私が知る限り、フレームワークのバグです。

于 2011-04-26T10:51:09.300 に答える
3

前の答えはかなり近いです。MKStoreKit は、ペアレンタル コントロールがオンになっているなどの有効なエラー状態のエラー メッセージを自動的に表示できます。

それにもかかわらず、購入のキャンセルを処理するために、MKStoreKitDelegate で transactionCanceled というデリゲート (v3.5 以降) も提供しました。

それを処理し、購入呼び出しを行うView Controllerのアクティビティスピナーまたは進行状況hudを停止します...

于 2011-04-27T09:33:51.813 に答える
0

キャンセルされたトランザクションのアラートをどこに表示するかは、あなたの責任と判断だと思います。ただし、必ず終了する必要があります。そうしないと、常に失敗に陥ります。したがって、次のようになります。

if (transaction.error.code == SKErrorPaymentCancelled) {
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
} else {
    [self notifyError:transaction.error];
}

更新: iPhone アプリ開発のビジネス: 成功するアプリの作成とマーケティングのため、Failed 状態への更新後にトランザクションを終了する必要があります。すべきではない状況があるかどうかを知ることは興味深いでしょう.

于 2016-01-26T18:06:51.940 に答える
0

インターネット接続がないことによるエラーは、ほとんどの場合、Apple の Reachability クラス IMO を使用するトランザクションの前にキャッチする必要があることを追加したかっただけです。このようにして、単純で一般的な種類のエラーについて Apple の API に依存する必要がなくなります。

于 2014-10-25T19:20:59.553 に答える