2012年2月24日TweetPocketStoreKitのトランザクションには、トラブルが発生した際に重要になる情報が多く含まれています。SKPaymentTransactionオブジェクトに含まれる情報と、それらの挙動について確認していきましょう。複雑になるのでNon-Consumableプロダクトのリストア関連の項目については、基本的に省略しています。SKPaymentTransactionの要素SKPaymentTransactionに含まれる主なプロパティは以下の通りです。(Non-Consumableプロダクトのリストア関連の要素は除いています)errorpaymenttransactionStatetransactionIdentifiertransactionReceipttransactionDate各要素について、挙動や使い方を確認していきましょう。transactionStateトランザクションがどういった状況にあるのか、を表すプロパティです。アプリケーション側からはこれをみて、トランザクションが実行中なのか、成功したのか、失敗したのかを判断し、UIを操作することになります。transactionStateには下記の四つのステートがあります。購入を開始しようとした状態。「購入しますか?」ダイアログが表示されるよりも前にこの状態になります。「購入する」を押してパスワード認証を終えて少しするとこの状態になります。なんらかのエラーが発生してトランザクションが正しく終了しなかった状態。「購入しますか?」ダイアログでキャンセルが押された場合にもこの状態になります。Non-consumableなプロダクトの復帰用。トランザクションのステートが変わると、SKPaymentQueueのオブザーバー側でデリゲートメソッドが呼び出されます。transactionIdentifierトランザクションを識別するためのIDです。トラブルが発生したときに、どの決済手続きで問題が発生したかを特定する上でとても重要な値です。このプロパティに含まれる値はタイミング/ステートによって変化するので注意が必要です。SKPaymentTransactionStateRestored.と書いてあり、transactionStateがPurchasedかRestoredの時以外にこのプロパティにセットされている値は未定義、となっています。トランザクションが失敗したときにここに入っている値については、内容が保証されていません。Sandbox)で試してみたところ、下記の用な感じになりました。7A6582BF-AC0F-4BB1-9AA2-****トランザクションが途中で中断され、再開された場合のtransactionIdentifierは中断されたものと同じ文字列になるようです。transactionDateトランザクションがキューに追加された日時が保存されています。Restoredの時以外に含まれる値は未定義なので注意が必要です。Storeのキューに追加される」というのがどのタイミングなのか厳密な説明は見つかりませんでした。実験してみたところ、下記のような値になりました。Storeのキューに追加された」タイミングは、「購入」を押してステートがPurchasedになったタイミングとほぼ同じになるようです。ローカルでSKPaymentQueueに追加されたタイミングとは異なるようなので、注意しておきましょう。ちなみに、この時刻はサーバー側での時刻になるようです。意図的に時計を30分ほどずらして試してみたところ、下記の用になりました。+0000Failedの時の値についてはnullになっていました。transactionReceipt決済が完了(Purchased)したときのみ参照できる、決済のレシート情報です。サーバーモデルのときには、サーバー側でその決済が有効であるかを検証する用途で使います。長くなるので、別の機会に説明します。paymentそのトランザクションが、どういったプロダクトに対する購入なのかを示すプロパティです。errorトランザクションがFailした場合に、このプロパティにエラー情報が含まれます。Storeに接続できません」になっているようです。以前の記事で書いた通り、SKErrorPaymentCancelledに関してはユーザが意図的にキャンセルした場合も、トランザクションが再開されてキャンセルされた場合も同じ情報が返ってきてしまうので注意が必要です。PMなんでレシートでトランザクションIDが数字のみなのに文字列なの。コメントをキャンセルメールアドレスが公開されることはありません。*ウェブサイトご意見、ご感想をお願いします。その2ARを学ぶ10連休。折り返し地点までの記録。その110連休に改めてARを勉強することにした。1日目から3日目まで。