프레임 워크 등록

프로젝트 세팅의 Build Phases탭의 Link Binary With Libraries에서 StoreKit.framework 를 선택하여 해당 프레임 워크를 추가 합니다.

헤더 등록

IAP를 사용하기 위해서는 프레임워크의 헤더들을 등록 하셔야 합니다.

#import <StoreKit/SKProductsRequest.h>
#import <StoreKit/SKProduct.h>
#import <StoreKit/SKPaymentQueue.h>
#import <StoreKit/SKPaymentTransaction.h>

스토어 설정 및 옵저버 등록

//스토어 사용 가능 여부 체크
if ([SKPaymentQueue canMakePayments]) {
  //옵저버 등록
  [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
}

옵저버를 등록할때 SKPaymentTransactionObserver Protocol을 구현이 필요합니다. (update만 필수)

옵저버 Update 프로토콜

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
    for (SKPaymentTransaction *transaction in transactions)
    {
        switch (transaction.transactionState)
        {
            case SKPaymentTransactionStatePurchased:
                [self completeTransaction:transaction];
                break;
            case SKPaymentTransactionStateFailed:
                [self failedTransaction:transaction];
                break;
            case SKPaymentTransactionStateRestored:
                [self restoreTransaction:transaction];
            default:
                break;
        }
    }
}

각 결과에 따라 실행 되도록 구현합니다.

- (void) restoreTransaction: (SKPaymentTransaction *)transaction
{
  NSLog(@"SKPaymentTransactionStateRestored");
  [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
- (void) failedTransaction: (SKPaymentTransaction *)transaction
{
  NSLog(@"SKPaymentTransactionStateFailed");
  [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
- (void) completeTransaction: (SKPaymentTransaction *)transaction
{
  NSLog(@"SKPaymentTransactionStatePurchased");

  NSLog(@"Trasaction Identifier : %@", transaction.transactionIdentifier);
  NSLog(@"Trasaction Date : %@", transaction.transactionDate);

  [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}

아이템 정보 가져오기

SKProductsRequest *productRequest = [[SKProductsRequest alloc]  
                        initWithProductIdentifiers:[NSSet setWithObject:@"아이템아이디"]];
productRequest.delegate = self;
[productRequest start];

init시 아이템아이디 배열로 동시에 여러개를 넣을수 있습니다.

SKProductsRequest에 대한 Delegate 추가

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
    NSLog(@"SKProductRequest got response");
    if( [response.products count] > 0 ) {
      SKProduct *product = [response.products objectAtIndex:0];
      NSLog(@"Title : %@", product.localizedTitle);
      NSLog(@"Description : %@", product.localizedDescription);
      NSLog(@"Price : %@", product.price);
    }   

    if( [response.invalidProductIdentifiers count] > 0 ) {
      NSString *invalidString = [response.invalidProductIdentifiers objectAtIndex:0];
      NSLog(@"Invalid Identifiers : %@", invalidString);
    }
}

아이템 결제 요청

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

이 후에는 애플에서 자동으로 로그인처리 및 결재 처리가 됩니다. 결제가 완료 되면 옵저버의 Update 함수가 호출 됩니다.