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>
#import <StoreKit/SKPayment.h>
 


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

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

NSLog(@"Start Shop!");

[[SKPaymentQueue defaultQueueaddTransactionObserver: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 defaultQueuefinishTransaction: transaction];

}

- (void) failedTransaction: (SKPaymentTransaction *)transaction

{

NSLog(@"SKPaymentTransactionStateFailed");

[[SKPaymentQueue defaultQueuefinishTransaction: transaction];

}

- (void) completeTransaction: (SKPaymentTransaction *)transaction

{

NSLog(@"SKPaymentTransactionStatePurchased");


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

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


[[SKPaymentQueue defaultQueuefinishTransaction: transaction];

}


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

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

SKProductsRequest *productRequest = [[SKProductsRequest allocinitWithProductIdentifiers:[NSSetsetWithObject:@"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 defaultQueueaddPayment:payment];


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

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


In App Purchase 를 구현하느라 몇일을 고생했습니다..ㅜㅜ

항상 막히는것은 뭐가 잘 안되더라구요. 책하고 똑같이 따라 한다고 했는데..

겨우 해결하고 저처럼 고생하는 분들이 있을까봐 이렇게 기록으로 남겨 봅니다.

우선 참조한 블로그는 아래와 같습니다..
 
유투브 동영상입니다. 다양한 사용법들이 많아 참조하기 좋습니다..^^
http://www.youtube.com/watch?v=xGDGO5P95Dg


In App Purchase 는 크게 2가지 과정으로 이루어 집니다..

첫번째는 애플사이트에 가서 등록을 하는 절차가 필요합니다.(저는 이곳에서 정말 고생했습니다.)
그리고 두번째로 코드를 적용하는것이지요..(위의 블로그를 참조하시면 한시간이면 됩니다.)

그럼 첫번째 과정인 애플사이트에 등록하는 법에 대해서 알아보겠습니다.



1. 우선 서비스 할 앱을 등록


아이튠즈커넥트 에 가서 Manage Your Applications 부분에서 Add New Application을 눌러 앱을 등록합니다.
리뷰를 들어가지 않고 그냥 테스트단계 까지만 진행하셔도 과금을 테스트 하는데 문제는 없습니다.
단. 어플을 XCODE에서 빌드할때 설정단계에서 identifier 의값을 고정값으로 넣어줍니다. 나중에 이 값이 필요합니다.

ex)  com.company.appname


2. 아이튠즈커넥트 사이트에서 판매할 아이템을 등록

1. 아이튠즈커넥트 사이트에 로긴 한다.
2. 하단 왼쪽에 Manage Users 로 들어가서 In App Purchase Test User를 등록한다.

3. 아이튠커넥트 사이트 메인의 Manage Your In App Purchases 로 들어가서 
Create New 를 누르고 추가과금을 할 앱을 선택한다.(1번과정에서 등록한 앱을 선택) 

4. Manage Your In App Purchases 로 다시 가면 등록한 앱이 보입니다. 앱을 선택해서 들어갑니다.
5. Create New를 누르고 Pricing와 Display Detail 값을 입력합니다. 
이 단계에서 For Review는 넣지 않습니다.(나중에 성공한 스샷을 올리면 되겠죠)
6. Save 를 누르고 나오면 리스트가 나옵니다..
선택해서 들어가보면 우측 상단에 States 가 빨간색으로 ㅇㅇㅇㅇ 라고 써있죠?
아이템 등록은 여기서 끝입니다..


다음은 과금을 테스트할 유저를 등록하는 과정입니다.
이부분에서 전 상당히 고생했습니다. 알고 보면 별게 아닌데..괜히 어렵게 생각해서..

3. 아이튠즈커넥트 사이트에서 테스트할 유저 등록

1. 아이튠즈커넥트사이트 메인에서 Manage Users 로 들어간다.
2. In App Purchase Test User를 누르고 들어간다.
3. Add New User을 눌러 새로운 유저를 등록한다.
4. 여기서 끝! 괜히 아이튠즈에 등록하고 비자카드 발급하고 난리 치지 않는다. (전 그랬습니다.ㅠㅠ)

에구 쓰다보니 길어졌네요.
코드 관련은 위 블로그 보시면 자세히 나오고 있습니다. 



사실 여기까지는 복잡해 보여도 금세 끝납니다.
코드도 뭐 바로 적용이 되지요..제가 시간이 많이 걸린건. 폰에 심고 성공메세지를 보는데 아이튠즈계정이 문제가 있다는 메세지 때문이었습니다..테스트계정이 등록이 안됬다던지 그런 부분이었는데요 그부분은 마지막에 다시 올려보겠습니다..


신고
by 화니뿡뿡 2012.03.06 11:05