StoreKitの支払いリクエストの作成と購入手続きの開始まで

投稿者: sota 投稿日:

Pocket

StoreKitにおける課金は、支払い(ペイメント)のリクエストをStoreKitに投げることではじまります。まだまだややこしい内容はでてきませんが、一つずつ確認していきます。

SKPayment

支払いのリクエストはSKPaymentというクラスを使って行います。SKPaymentには購入するアイテムのプロダクトIDと個数(オプション)の情報が含まれます。「com.example.bombを10個」みたいな。SKPaymentオブジェクトは使い回しができる(「com.example.bombをさらに10個」とか)ができるのですが、これについては置いておきましょう。
SKPaymentには+[SKPayment paymentWithProduct:]と+[SKPayment paymentWithProductIdentifier:]の二つのコンビニエンスコンストラクタが用意されていて、インスタンス生成はこれらを使います。後者はiOS 5.0ではdeprecated扱いになり、Mac版のフレームワークドキュメントにはそもそも記載がなかったので、基本的には+[SKPayment paymentWithProduct:]を使え、ということでしょう。(が、In App Purchase Programming GuideのサンプルではpaymentWithProductIdentifier:が使われているコードがありますが…)
なお、OSの設定でアプリ内課金が制限されているような場合、購入手続きは失敗してしまうのですが、[SKPaymentQueue canMakePayments]を呼ぶと事前にアプリ内課金が有効かどうかを確認することができます。

購入手続きの開始

生成したSKPaymentのインスタンスをStoreKitのキューに積むと、いよいよ購入手続きが始まります。

SKPayment *payment = [SKPayment paymentWithProduct:adFree];
[[SKPaymentQueue defaultQueue] addPayment:payment];

前回のポストにも書いたように、In App Purchase Programming Guideには「Your application cannot create a payment request unless you have first retrieved the product information for that product.」という説明があるのですが、+[SKPayment paymentWithProductIdentifier:]を使って、サーバーから情報をしてきていないプロダクトに対するSKPaymentを作ろうとしたところSKPaymentのインスタンス自体は作成でき、Queueに積むところまで確認できました。しかし、その後購入ダイアログが出出る事はなく、次のポスト以降で見ていくオブザーバーの方ではトランザクションに失敗したことが通知されていました。
まあ、paymentWithProductIdentifier:はdeprecatedだし、paymentWithProduct:にはStoreKitから取得したSKProductのインスタンスが必要なので、素直にドキュメントに従ってプロダクト情報を取得してからペイメントをリクエストしましょう。
ちなみに、Fast App Switchingが登場しアプリの起動時間が長くなった現在、アプリ起動時だけにプロダクト情報を取得するような実装になっていると、そこから実際にPaymentを作るまでの間にカップラーメンを何百個も作れる程の時間が流れてしまう可能性があります。それだけの時間が空いてしまっても問題ないのか、気になって調べようと思いましたが、そこまで時間をかけて調べるのは相当時間がかかるし、そもそもプロダクト情報取得は最初の一回以外はストレスのない時間(0.7秒とか)でレスポンスが返ってくることを考えると、毎回購入直前に最新のプロダクト情報を取りにいけばいいんじゃないか、ということに気がつきました。

結論

ユーザが特定のプロダクトを買おうとしたら(個数=1の場合)

  1. そのプロダクトIDのプロダクトの情報をSKProductRequestで取得してくる
  2. 返ってきたSKProductを使って+[SKPayment paymentWithProduct:]でリクエストを作る
が無難でしょうか。この流れを作る場合、StoreKitが標準で提供しているdelegateを使うAPIで実装しようとすると非常に書きにくいので、ブロック対応のラッバーを作ってメソッドチェーンを作っていくのがおすすめです。

次に、トランザクションについて見ていきます。

カテゴリー: iPadiPhoneMacStoreKit

2件のコメント

プロダクト情報の取得 | なんてこったいブログ · 2011年10月30日 1:10 AM

[…] 自前でブロック対応の関数を用意すると便利になりますが、今回は省略。次は支払いリクエストを作成する部分を見ていきます。 カテゴリー: iPad, iPhone, Mac, StoreKit   パーマリンク &l […]

Swift 雑Memo 2014/08 – THE LAST DAY · 2014年8月22日 5:03 PM

[…] STOREKITと闘う 2011/10/28 http://nantekottai.com/2011/10/28/storekit/ STOREKITの正常な決済の流れ 2011/10/28 http://nantekottai.com/2011/10/28/storekit-regular-flow/ プロダクト情報の取得 2011/10/29 http://nantekottai.com/2011/10/29/getting-product-info/ STOREKITの支払いリクエストの作成と購入手続きの開始まで 2011/10/30 http://nantekottai.com/2011/10/30/storekit-payment/ […]

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です