42
40

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

仙台iOS開発者勉強会(SWWDC)Advent Calendar 2014

Day 9

[iOS]アプリ内課金の金額をあらかじめ表示する

Last updated at Posted at 2014-12-09

iOSアプリにアプリ内課金を組み込んだ時は、あらかじめ金額を表示しておくとユーザーに親切です。
最近の円安でまた金額改定があるかもしれないですし、表示する金額はApp Storeから取得するのが吉です。

ユーザーのサインインは不要

金額(アプリの情報)を取得するだけならユーザーがApple IDでサインインしていなくても大丈夫です。
また、ここでは購入処理(addPayment)は行わないので、金額取得するだけならSKPaymentQueueのオブザーバー登録は不要です。

コード

##以下の要領で取得できます。

viewController.h
#import <UIKit/UIKit.h>
#import <StoreKit/StoreKit.h>

@interface InAppPurchasesViewController : UIViewController
<
// SKProductsRequestのプロトコロル
SKProductsRequestDelegate
> {
}
// インジケータ表示用の画面を覆うview(backgroundColorを黒とかにしておく)
@property (weak, nonatomic) IBOutlet UIView *indicatorView;
// インジケータ(indicatoerViewに乗せます)
@property (weak, nonatomic) IBOutlet UIActivityIndicatorView *indicator;
// 例えばボタンに金額を表示するなら
@property (weak, nonatomic) IBOutlet UIButton *buyButton;

@end
viewController.m
- (void)viewWillAppear:(BOOL)animated
{
    // インジケータ表示
    [self indicator:YES];
    // 購入価格取得開始
    NSSet *set = [NSSet setWithObjects:@"プロダクトID", nil];
    self.skProductsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:set];
    self.skProductsRequest.delegate = self;
    [self.skProductsRequest start];
}
viewController.m
// リクエスト取得完了時のdelegate
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
    if (response == nil) {
        NSLog(@"no response");
        // インジケータを止める
        [self indicator:NO];
        return;
    }
    // 無効なアイテムがないかチェック
    if ([response.invalidProductIdentifiers count] > 0) {
        NSLog(@"PRODACTION_ID error. count:%d", [response.invalidProductIdentifiers count]);
        // インジケータを止める
        [self indicator:NO];
        return;
    }
    // 価格取得処理開始
    for (SKProduct *product in response.products) {
        // フォーマット
        NSNumberFormatter *numberFmt = [[NSNumberFormatter alloc] init];
        [numberFmt setFormatterBehavior:NSNumberFormatterBehavior10_4];
        [numberFmt setNumberStyle:NSNumberFormatterCurrencyStyle];
        // PriceLocalを設定(ユーザーの環境に合わせた金額を取得する)
        [numberFmt setLocale:product.priceLocale];
        NSString *str = [numberFmt stringFromNumber:product.price];
        NSString *fmtStr = [NSString stringWithFormat:@"「購入金額は %@ です", str];
        // 例えばボタンに表示
        [self.buyButton setTitle:fmtStr forState:UIControlStateNormal];
        // インジケータを止める
        [self indicator:NO];

        // 他の情報
        //NSLog(@"   id:%@",[product productIdentifier]);
        //NSLog(@"title:%@",product.localizedTitle);
        //NSLog(@" desc:%@",product.localizedDescription);
        //NSLog(@"price:%@",formattedString);
    }
}

##おまけ。インジケータ処理。
UIActivityIndicatorViewをviewに貼り付けてIBOutletで接続しておきます。
結構時間がかかることもあるのでインジケータは表示しましょう。

viewController.m
// indicator
- (void)indicator:(BOOL)start
{
    if (start) {
        // indicator start
        // 全面を覆うviewを表示
        [self.indicatorView setAlpha:0.6];
        // インジケータを回す
        [self.indicator startAnimating];
        // ステータスバーのインジケータも表示
        [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
        // (必要なら)バックボタンを消す
        [self.navigationItem setHidesBackButton:YES animated:YES];
    } else {
        // indicator stop
        // 全面を覆うviewを非表示にする
        [self.indicatorView setAlpha:0.0];
        // インジケータを止める
        [self.indicator stopAnimating];
        // ステータスバーのインジケータも消す
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
        // (必要なら)バックボタンを表示する
        [self.navigationItem setHidesBackButton:NO animated:YES];
    }
}
´´´
42
40
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
42
40

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?