2014年6月27日金曜日

【iOS技術連載】In-App Purchase 第3回 - 購入処理と購入の持続

In-App Purchaseに関する連載3回目です。
今回は、利用者が購入操作を行った際の、支払いに関する処理ついてご紹介します。


まず、App Storeから取得したプロダクト情報(SKProduct)を利用して、支払い情報を生成し、支払いトランザクションに追加します。
プロダクトの取得については、連載2回目を参照してください。


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


支払いトランザクションからの通知を受け取るためには、あらかじめ(application: didFinishLaunchingWithOptions: などで)キューの監視を開始しておく必要があります:


  [[SKPaymentQueue defaultQueue] addTransactionObserver:singleton];


トランザクションに変化があると、SKPaymentTransactionObserverプロトコルに通知されます。
例えば、以下のようにトランザクションの状態に応じた処理を行います:


  - (void)paymentQueue:(SKPaymentQueue *)queue
   updatedTransactions:(NSArray *)transactions {

      // 通知された支払いトランザクションそれぞれについて:
      for (SKPaymentTransaction *transaction in transactions) {
          switch (transaction.transactionState) {
              case SKPaymentTransactionStatePurchased: {
                  // プロダクト購入が完了した。
                  // プロダクトを使えるようにする(★)。

                  [queue finishTransaction:transaction];
                  break;
              }
              case SKPaymentTransactionStateRestored: {
                  // 購入済みプロダクトの復元が完了した。
                  // 多くの場合、購入完了時と共用可能(★)。

                  [queue finishTransaction:transaction];
                  break;
              }
              case SKPaymentTransactionStateFailed: {
                  // 支払い処理が失敗した。
                  // エラー表示などを行う。

                  [queue finishTransaction:transaction];
                  break;
              }
          }
      }
  }


支払いトランザクションのエラーは、下記メソッドでハンドリングします:


  - (void)paymentQueue:(SKPaymentQueue *)queue
    restoreCompletedTransactionsFailedWithError:(NSError *)error {
      // 支払いトランザクションがエラーを引き起こした。
      // 利用者に対するメッセージ表示、画面の再描画などを行う。
  }


後の連載で別途ご紹介しますが、購入済みプロダクトの復元処理の完了のハンドリングには、以下のメソッドを使用します:

  - (void)paymentQueueRestoreCompletedTransactionsFinished:
          (SKPaymentQueue *)queue;


■購入の持続

支払いトランザクションが無事完了したら、購入されたプロダクトを利用者が使用できるようにする必要があります(上記コード例の「★」の部分)。

「非消耗型」プロダクトの場合、プロダクトIDなどをNSUserDefaultsやNSUbiquitousKeyValueStoreに保持するのが簡単です。

Speedy - ケータイ風短縮ダイヤル」では、NSUserDefaultsに記録しています。
Countil - あと何日で・・・」ではNSUserDefaultsに加えて(利用者がiCloudを使用していれば)NSUbiquitousKeyValueStoreにも記録します。

iCloudを利用することで、ある端末でプロダクトを購入すれば、同一利用者の他の端末でも自動的に購入済みとすることができます。



今回は、利用者が購入操作を行った場合の支払い処理についてご紹介しました。
次回は、購入済みプロダクトの復元についてご紹介する予定です。





0 件のコメント:

コメントを投稿