[iOS]アプリ内課金(購入する) | Cocoa練習帳

[iOS]アプリ内課金(購入する)

前回は、登録したプロダクトの情報が取得されたまでで、今回はそれを選択して、購入してみる。




開発者サイトの情報には制限があるので、概要の説明で我慢して欲しい。




著者の経験から最初にやっておいた方がいいのが、アプリケーション内課金用の試験アカウントを用意だ。試験用とはいえ、通常のApple IDと同様な条件で作成なので、色々と準備しておく事があるので、デバッグ段階だと慌ててしまうと思う。やり方だが、iTunes ConnectのManag UsersでTest Userを作成する。操作自体は、それ程、難しいものではないと思う。




購入処理を行うクラスに、SKPaymentTransactionObserverを設定する。




#import <UIKit/UIKit.h>
#import <StoreKit/StoreKit.h>
 
@interface ViewController : UIViewController

 
@end



初期化を行う箇所に以下のコードを追加する。サンプルでは、SKPaymentTransactionObserverプロトコルを設定した、ビュー・コントローラを指定している。




- (void)viewDidLoad
{
    [super viewDidLoad];

    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
}



購入やリストアのトランザクションに対応するメソッドを実装する。




- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
    for (SKPaymentTransaction *transaction in transactions)
    {
        switch (transaction.transactionState)
        {
            case SKPaymentTransactionStatePurchased:
                NSLog(@"%s, SKPaymentTransactionStatePurchased", __func__);
                [self completeTransaction:transaction];
                break;
            case SKPaymentTransactionStateFailed:
                NSLog(@"%s, SKPaymentTransactionStateFailed", __func__);
                [self failedTransaction:transaction];
                break;
            case SKPaymentTransactionStateRestored:
                NSLog(@"%s, SKPaymentTransactionStateRestored", __func__);
                [self restoreTransaction:transaction];
            default:
                break;
        }
    }
}
 
- (void)completeTransaction:(SKPaymentTransaction *)transaction
{
    //[self recordTransaction: transaction];
    //[self provideContent: transaction.payment.productIdentifier];
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
 
- (void)failedTransaction:(SKPaymentTransaction *)transaction
{
    if (transaction.error.code != SKErrorPaymentCancelled) {
        NSLog(@"transaction.error.code is not SKErrorPaymentCancelled");
    }
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
 
- (void)restoreTransaction:(SKPaymentTransaction *)transaction
{
    //[self recordTransaction: transaction];
    //[self provideContent:transaction.originalTransaction.payment.productIdentifier];
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}



本当に仮の実装。前回のプロダクト情報を取得するメソッドで、取得したプロダクトを購入する。




- (void)productsRequest:(SKProductsRequest *)request
     didReceiveResponse:(SKProductsResponse *)response
{
    for (SKProduct *product in response.products) {
        SKPayment *payment = [SKPayment paymentWithProduct:product];
        [[SKPaymentQueue defaultQueue] addPayment:payment];
    }
}



シミュレータで実行。すると、本当に購入するか聞いてきた。




購入確認




購入を選択すると、シミュレータなのでIDを聞いてきた。先ほど作成した試験用IDを指定すればいい。




識別子




すると、完了が通知された。




済み




デバッグ出力も印字されている。




-[ViewController paymentQueue:updatedTransactions:], SKPaymentTransactionStatePurchased



関連情報
In App Purchase プログラミングガイド