アトトックラボ

2011年8月04日

iOS AppのIn App Purchase、Non-consumable(非消耗型) の実装

Posted by Yoichi Kurusaki

iOS Appのアプリ内課金を実装してみます。
今回は、Non-consumable(非消耗型) の課金処理を実装してみました。

準備

  1. iTunes ConnectのManage Your Applicationsでアプリを追加
  2. Manage In-App Purchasesでプロダクトを追加
  3. Reference Name、Product ID、Language、Display Name、Description、Pricing、Screenshot for Reviewなどを設定します。
  4. iTunes ConnectのManage UsersでTest Userを追加
  5. アプリ内課金を実機でテストする時に使用するユーザーを登録します。 アプリ内課金のテストはAppleが提供しているサンドボックス環境で動作します。 そのためテスト用のアカウントを使用し、テストでは実際に課金されることはありません。
  6. 実機をStoreからサインアウトした状態にする
  7. 課金処理はシミュレータでは動作しないため実機でテストします。 実機でテストする前に、いつも使っているアカウントで処理を行わないようにサインアウトします。

実装と動作確認

購入ボタンの処理

「アドオンを購入」ボタンを画面に追加し、ボタンをタップした時の処理を実装します。 下記のコードでは、iTunes Connectで追加したアプリ内課金のプロダクトIDを指定して App Storeへプロダクト情報を要求します。
SKProductsRequest *request = 
  [[SKProductsRequest alloc] 
  initWithProductIdentifiers:
[NSSet setWithObject:@"ここにProduct IDを設定"]];
request.delegate = self;
[request start];

SKRequestDelegateのメソッド

ネットワークに接続できないなどエラーが発生した場合に呼ばれる SKRequestDelegateのメソッド、request:didFailWithError:を実装します。
-(void)request:(SKRequest*)request didFailWithError:(NSError*)error 
{


}

レスポンスが正常に返ったときに呼ばれるproductsRequest:didReceiveResponse:を実装します。
ここでは購入要求(SKPayment)を作成し、購入処理を実行します。

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response 
{ 
	if(response == nil || response.products == nil || [response.products count] <= 0) {
        return ;
    }

    NSArray *products = response.products;	
    SKProduct *product = [products objectAtIndex:0];

    // 購入要求を作成
 SKPayment *payment = [SKPayment paymentWithProductIdentifier:product.productIdentifier];
    
    // 購入処理
    [[SKPaymentQueue defaultQueue] addPayment:payment];


    NSLog(@"product.localizedDescription : %@",product.localizedDescription);
    NSLog(@"product.localizedTitle : %@",product.localizedTitle);
    NSLog(@"product.price.doubleValue : %f",product.price.doubleValue);
    NSLog(@"product.priceLocale : %@",product.priceLocale);
    NSLog(@"product.productIdentifier : %@",product.productIdentifier);
}

購入処理を実行すると、iTunes Connectで設定した内容で確認メッセージが表示されます。
「キャンセル」または「購入する」を選択し処理を進めます。
20110804000001.jpg

テスト用に作成したアカウントでサインインします。
20110804000002.jpg

20110804000003.jpg

SKPaymentQueue

購入処理の結果を受け取るための処理を実装します。
SKPaymentQueueのオブザーバーを設定します。

- (void)viewDidLoad {
    [super viewDidLoad];
    

	
    // SKPaymentQueueのオブザーバーに設定
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    
}

SKPaymentTransactionObserver Protocolを実装し、購入処理の結果を受け取れるようにします。

-(void)paymentQueue:(SKPaymentQueue*)queue updatedTransactions:(NSArray *)transactions
{
    for(SKPaymentTransaction *transaction in transactions) {
        // 購入中
        if(transaction.transactionState == SKPaymentTransactionStatePurchasing) {
            continue;
        }
        // 購入処理が成功
        if(transaction.transactionState == SKPaymentTransactionStatePurchased) {
            // 購入結果をアプリ内に保存し、ボタンなどの状態を調整
            
            // 購入処理完了
            [queue finishTransaction:transaction];
            continue;
        }
        // 購入処理が失敗
        if(transaction.transactionState == SKPaymentTransactionStateFailed) {
            // 購入処理完了
            [queue finishTransaction:transaction];
        }
        // 購入処理を復元
        if(transaction.transactionState == SKPaymentTransactionStateRestored) {
            // 購入処理完了
            [queue finishTransaction:transaction];
        }
    }
} 

購入処理の完了

購入処理が正常に完了すると、メッセージが表示されます。

20110804000004.jpg