Develop

[ios] In App Purchase 개발

by hooni posted Nov 20, 2013
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄
간단 설명~
코드 이해 한 상태에서 가져다 쓰기 편한 내용..

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함수가 호출된다.

[출처] http://creative-xenos.tistory.com/entry/In-App-Purchase-%EA%B0%9C%EB%B0%9C