2012年1月4日TweetPocket久しぶりにStoreKitについての記事です。Switchingやスリープに関する説明がありません。Switching)が発生すると、アプリケーションは正しくトランザクションの状態変化を把握できなくなってしまいます。そこで、この問題についての対策を考えます。この部分の挙動が変更になったようです。再検証を行ったのでこちらの記事を参照してください。注意この記事は、Apple公式ドキュメント類では説明/推奨されていない実装方法についての考察です。挙動や実装は将来的に大きく変わる可能性があり、動作は一切保証できません。参考にする程度にとどめ、もし下記に書かれている内容を実装する場合は自己責任で行ってください。前述してきた通り、アプリ内課金を実装していく上で厄介なのは購入手続き(トランザクション)の途中で、アプリケーション/デバイスの状態が変化し正しくトランザクションの状態変化を追えなくなることです。Switchingでアプリケーションがバックグラウンドに移行した場合、スリープした場合について見ていきましょう。Switchingが行われた場合にどうなるか、下記の手順で検証していきましょう。AppStoreにプロダクト情報を取得しにいくPaymentを作成してキューに積む購入しますか?ダイアログでOKを押す(必要があればAppStoreへのサインインを完了する)ダイアログが消えたらホームボタンを2回連続で押して適当なアプリケーションに切り替える。(トランザクションのステートがSKPaymentTransactionStatePurchasedになる前に完了させること)アプリケーションがバックグラウンドに移行するため、この状態でSKPaymentTransactionStatePurchasedに変わった通知がどのように受け取れるのか、受け取れない場合どうするべきなのか、を見ていきます。Switchingによるアプリ切り替えを行わずに正しく購入手続きが進む場合、下記のような流れでトランザクションが完了します。removedはpaymentQueue:removedTransactions:が呼ばれたときに出力しています。トランザクション作成から4秒程で手続きが完了しました。purchasing.ログはこの状態で止まり、バックグラウンド状態ではObserverはSKPaymentTransactionStatePurchasedの通知を受け取れません。Switchingでアプリをフォアグラウンドに戻しても、SKPaymentTransactionStatePurchasedの通知は届きません。このキャッチできなかったトランザクションの扱いについては、トランザクションが完了する前にアプリケーションが終了してしまった場合と同じく、次回アプリケーションを起動し直したときにPaymentQueueがシンクされるタイミングで再びObserverに通知されます。アプリケーションが終了せずにフォアグラウンドに戻ってきた場合の挙動も、トランザクション完了前にアプリを終了/再起動し、Queueの同期が完了する迄の間と同じような挙動になります。ReferenceのaddTransactionObserver:の説明には、下記の文があります。transactions.この説明自体は、「オブザーバーが一つも登録されていなかったら、pending状態のトランザクションを同期しないよ」ということを言っているだけなのですが、これを利用すると逆にフォアグラウンドに戻った状態でトランザクションを再開できるようです。}];具体的にはアプリケーションがバックグラウンドに入るタイミング(applicationDidEnterBackground)でobserverをremoveしておき、フォアグラウンドに戻るタイミング(applicationWillEnterForeground)で再びaddし直してあげると、フォアグラウンドに戻ったタイミングでバックグラウンドに入ったタイミングで中断していたトランザクションに関する通知を再び受ける事ができました。Switching、スリープの対策は、他の方法で実現するのは難しいように思います。加えて、SKPaymentQueueのremoveTransactionObserver:というAPIは他に使う場面が思い浮かばないですし、基本は「バックグラウンドに入ったらobserveをやめ、フォアグラウンドに入ったら再びobserverしなおす」という方針が正しいのではないかと考えています。Guideで公式な説明/指南が欲しいものです。Switchingに関するイベントもこれを使ってハンドリングできます。前回の記事でも使いましたが、コードはシンプルです。コメントをキャンセルメールアドレスが公開されることはありません。*ウェブサイトご意見、ご感想をお願いします。その2ARを学ぶ10連休。折り返し地点までの記録。その110連休に改めてARを勉強することにした。1日目から3日目まで。