【In-App Purchase】自分なりにアプリ内課金備忘録

アプリ内課金。
なんかめんどくさそう。
Appleのサーバとやりとりがどーたら。
ゆーててもしゃないので適当にやってみた。

参考サイト
iTunesConnect アプリ内課金 プロダクト作成 手順 – 散歩しながら 〜〜アプリ開発〜〜
失敗しない iOS In-App Purchase プログラミング – A Day In The Life
頭と尻尾はくれてやる! 初めてのアプリ内課金

課金コンテンツをAppleに預ける – How to implement "Hosting Content with Apple" – おおばログ

前提としてiTunes Connectのアプリで販売する物のプロダクトIDをつくっておく。
とりあえずココでは割愛。

で、まず、前処理としてアプリが課金可能な状態か確認する。

#pragma mark 購入前処理
-(void)canMakePayment
{
    if (![SKPaymentQueue canMakePayments])//購入制限がかかっている場合
    {
        
        // コントローラを生成
        UIAlertController * ac =
        [UIAlertController alertControllerWithTitle:@"Error"
                                            message:@"App billing are not allowed"
                                     preferredStyle:UIAlertControllerStyleAlert];
        
        // OK用のアクションを生成
        UIAlertAction * okAction =
        [UIAlertAction actionWithTitle:@"OK"
                                 style:UIAlertActionStyleDefault
                               handler:^(UIAlertAction * action) {
                                   // ボタンタップ時の処理
                                   NSLog(@"OK button tapped.");
                                   //購入制限がかかってたらなんかするときはココ
                               }];
        
        // コントローラにアクションを追加
        [ac addAction:okAction];
    }
}

続いて購入ボタンを押してプロダクトIDをセットして購入処理に入る。

#pragma mark 購入処理
- (IBAction)removeAdsButton:(id)sender {
    [self startPayment];
}

-(void)startPayment{
    //プロダクト情報のリクエストを開始。
    NSSet *set = [NSSet setWithObjects:@"ここに買うアイテムのプロダクトID", nil];
    SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:set];
    productsRequest.delegate = self;
    [productsRequest start];

}

プロダクトIDがセットされたらproductRequestに送られる。
よくわからんが、IDが間違ってないか確認してから支払い処理に投げるっぽい。

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
    // 無効なアイテムがないかチェック
    if ([response.invalidProductIdentifiers count] > 0)
    {
        // コントローラを生成
        UIAlertController * ac =
        [UIAlertController alertControllerWithTitle:@"Error"
                                            message:@"item ID is not correct."//アイテムIDが不正です。
                                     preferredStyle:UIAlertControllerStyleAlert];
        
        // OK用のアクションを生成
        UIAlertAction * okAction =
        [UIAlertAction actionWithTitle:@"OK"
                                 style:UIAlertActionStyleDefault
                               handler:^(UIAlertAction * action) {
                                   // ボタンタップ時の処理
                                   NSLog(@"OK button tapped.");
                               }];
        
        // コントローラにアクションを追加
        [ac addAction:okAction];
        
    }else
    {
        // 購入処理開始
        [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
        for (SKProduct *product in response.products)
            {
                SKPayment *payment = [SKPayment paymentWithProduct:product];
                [[SKPaymentQueue defaultQueue] addPayment:payment];
            }
    }
}

上記メソッドから自動で下記paymentQueueに投げられる。

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
    for (SKPaymentTransaction *transaction in transactions) {
        if (transaction.transactionState == SKPaymentTransactionStatePurchasing) {
            // 購入処理中
            NSLog(@"購入処理中");
            /*
             * 基本何もしなくてよい。処理中であることがわかるようにインジケータをだすなど。
             */
            
        } else if (transaction.transactionState == SKPaymentTransactionStatePurchased) {
            // 購入処理成功
            //ここでレシートの確認やアイテムの付与を行う。

            NSLog(@"広告の削除 %d",_removeAds);
            NSLog(@"購入処理成功");
            [queue finishTransaction:transaction];
            
        } else if (transaction.transactionState == SKPaymentTransactionStateFailed) {
            // 購入処理エラー。ユーザが購入処理をキャンセルした場合もここにくる
            [queue finishTransaction:transaction];
            NSLog(@"購入処理失敗");
            // エラーが発生したことをユーザに知らせる
            // コントローラを生成
            UIAlertController * ac =
            [UIAlertController alertControllerWithTitle:@"Error"
                                                message:[transaction.error localizedDescription]//アイテムIDが不正です。
                                         preferredStyle:UIAlertControllerStyleAlert];
            
            // OK用のアクションを生成
            UIAlertAction * okAction =
            [UIAlertAction actionWithTitle:@"OK"
                                     style:UIAlertActionStyleDefault
                                   handler:^(UIAlertAction * action) {
                                       // ボタンタップ時の処理
                                       NSLog(@"OK button tapped.");
                                   }];
            
            // コントローラにアクションを追加
            [ac addAction:okAction];
            

        } else {
            // リストア処理完了
            /*
             * アイテムの再付与を行う
             */
            [queue finishTransaction:transaction];
        }
    }		
}

うまく機能すれば支払いの確認のダイアログが出てOKすると支払い処理がなされる。

なんかリストア処理も入ってるっぽいので多分大丈夫じゃないかな。
複数の課金アイテムがあると処理がややこしそう。
自分用メモなので違ってたらゴメンね。
うじゃうじゃ。

コメントを残す

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