어플/Programming2012. 2. 3. 12:40
1. 프레임워크 등록
무엇보다도 먼저, 자신의 App에 프레임워크를 등록해주어야 한다.
왼쪽 'Group & Files'에서 'Frameworks'에서 오른쪽 버튼을 누르고, 'Add...'-'Existing Frameworks'를 선택한다.
그리고, 'StoreKit.framework'를 선택하여, 해당 프레임워크를 추가한다.

2. 헤더 등록
In App Purchase를 이용하기 위해서는 기본적으로 다음과 같은 헤더파일들을 추가해주어야 한다.

#import <StoreKit/SKProductsRequest.h>

#import <StoreKit/SKProduct.h>

#import <StoreKit/SKPaymentQueue.h>

#import <StoreKit/SKPaymentTransaction.h>


3. 스토어 설정 및 Observer 등록
먼저, 스토어를 사용할 수 있는지 확인해야 하고, 사용 가능하다면 Observer를 등록해야 한다.

if ([SKPaymentQueue canMakePayments]) { // 스토어가 사용 가능하다면

NSLog(@"Start Shop!");

[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; // Observer 등록한다.

}

else

NSLog(@"Failed Shop!");


옵져버를 등록할때, 해당 인스턴스는 SKPaymentTransactionObserver Protocol을 구현해야 한다. 그중 update만을 구현해도 사용하는데 문제 없다.

3. 옵져버 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];

}


이런식으로 구성하면 된다.

4. 아이템정보 가져오기
특정 아이템 정보를 가져오기 위해서는 SKProductRequest를 사용한다.

SKProductsRequest *productRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:@"testitem_01"]];

productRequest.delegate = self;

[productRequest start];

여기서 initWithProductIdentifiers 에는 아이템 등록할때 넣었던 'Product ID'를 넣을 수 있으며, 배열로 여러개 동시에 넣을수도 있다.

델리게이트는 SKProductRequestDelegate Protocol을 구현해야 한다.

위의 요청이 성공하게 되면, responseRequest를 호출하게 되는데, 다음과 같이 받을 수 있다.

- (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);

}

}


5. Item 결제 요청 하기
원하는 아이템을 결제요청은 SKPayment를 이용한다.

SKPayment *payment = [SKPayment paymentWithProduct:product];

[[SKPaymentQueue defaultQueue] addPayment:payment];


이렇게 해주면, 그 뒤는 애플에서 알아서 처리하도록 되어 있다.

결제가 끝나면, 지정해준 Observer의 update함수가 호출된다.

#import <StoreKit/SKPayment.h> 추가 필요

[출처] creative-xenos
 
Posted by 프로처럼