Views 13766 Votes 0 Comment 0
Atachment
Attachment '1'
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print

코드 구현


iTunes Connect에 In App Purchase관련 웹 설정을 마쳤다면 이제 실제로 인앱을 연동하는 코딩이 남았다.

참고 Built-In Product Model


iap01.png


먼저 StoreKit Framework를 추가해야한다.


TARGETS -> Build Phases -> Link Binary With Libraries에서 "+"를 클릭해 StoreKit.framework를 추가.

 New File -> Objective-C Class에서 NSObject를 상속받는 InAppPurchase class를 mm으로 만듭니다.

이하 소스와 주석으로 설명을 대신한다.


///< InAppPurchase.h
///< 인앱결제 사용을 위해 StoreKit.h 를 추가

#import <StoreKit/StoreKit.h>

@interface InAppPurchase : NSObject<
///< 상품 정보를 얻어올 때 쓰는 딜리게이트
SKProductsRequestDelegate,
///< 상품 구매 관련 옵저버
SKPaymentTransactionObserver>

- (BOOL) initIAP;
- (void) requestProductData;

- (void) completeTransaction:(SKPaymentTransaction*)transaction;
- (void) restoreTransaction:(SKPaymentTransaction*)transaction;
- (void) failedTransaction:(SKPaymentTransaction*)transaction;
@end

///< InAppPurchase.mm

- (BOOL) initIAP
{
    ///< 인앱 결제 시스템을 사용 가능한지 체크
    if( [SKPaymentQueue canMakePayments] == NO )
        return NO;
    
    ///< Product 결제 진행에 필요한 딜리게이트 등록
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    
    CCLOG("InAppPurchase init OK");
    return true;
}

///< 아이템 정보 요청
- (void) requestProductData()
{
    ///< iTunes Connect에 설정한 Product ID들
    NSSet* productIdentifiers = [NSSet setWithObject:@"testitem1"];
    SKProductsRequest* request =
    [[SKProductsRequest alloc]
        initWithProductIdentifiers:productIdentifiers];
    request.delegate = self;
    [request start];
}

///< 아이템 정보 요청 결과 callback
- (void) productsRequest:(SKProductsRequest *)request
            didReceiveResponse:(SKProductsResponse *)response
{
    NSLog( @"InAppPurchase didReceiveResponse" );
    for( SKProduct* product in response.products )
    {
        if( product != nil )
        {
            NSLog(@"InAppPurchase Product title: %@",
                product.localizedTitle);
            NSLog(@"InAppPurchase Product description: %@",
                product.localizedDescription);
            NSLog(@"InAppPurchase Product price: %@",
                product.price);
            //product.priceLocale
            NSLog(@"InAppPurchase Product id: %@",
                product.productIdentifier);
            
            ///< 구매 요청
            
            SKPayment* payment = [SKPayment paymentWithProduct:product];
            //payment.quantity = 10;
            [[SKPaymentQueue defaultQueue] addPayment:payment];
        }
    }
    
    [request release];
    
    for (NSString *invalidProductId in response.invalidProductIdentifiers)
    {
        NSLog(@"InAppPurchase Invalid product id: %@", invalidProductId);
    }
}

///< 새로운 거래가 발생하거나 갱신될 때 호출된다.
- (void) paymentQueue:(SKPaymentQueue *)queue
                updatedTransactions:(NSArray *)transactions
{
    for (SKPaymentTransaction *transaction in transactions)
    {
        switch (transaction.transactionState)
        {
                ///< 서버에 거래 처리중
            case SKPaymentTransactionStatePurchasing:
                NSLog(@"InAppPurchase SKPaymentTransactionStatePurchasing");
                break;
                ///< 구매 완료
            case SKPaymentTransactionStatePurchased:
                [self completeTransaction:transaction];
                break;
                ///< 거래 실패 또는 취소
            case SKPaymentTransactionStateFailed:
                [self failedTransaction:transaction];
                break;
                ///< 재구매
            case SKPaymentTransactionStateRestored:
                [self restoreTransaction:transaction];
                break;
        }
    }
}

- (void) completeTransaction:(SKPaymentTransaction *)transaction
{
    NSLog(@"InAppPurchase completeTransaction");
    NSLog(@"InAppPurchase Transaction Identifier : %@",
        transaction.transactionIdentifier );
    NSLog(@"InAppPurchase Transaction Data : %@",
        transaction.transactionDate);
    ///< 구매 완료 후 아이템 인벤등 게임쪽 후 처리 진행
    
    // Remove the transaction from the payment queue.
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}

- (void) restoreTransaction:(SKPaymentTransaction *)transaction
{
    NSLog(@"InAppPurchase restoreTransaction");
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}

- (void) failedTransaction:(SKPaymentTransaction *)transaction
{
    CCLOG( "InAppPurchase failedTransaction." );
    CCString* pStrFailed = 0;
    if( transaction.error.code != SKErrorPaymentCancelled )
    {
        pStrFailed = ccs( "faileIAP" );
        CCLOG("InAppPurchase failedTransaction SKErrorDomain - %d",
            transaction.error.code );
    }
    else
    {
        pStrFailed = ccs( "cancelIAP" );
        CCLOG("InAppPurchase failedTransaction SKErrorPaymentCancelled");
    }
    ///< 실패나 취소에 대한 것을 게임쪽에 알려준다.
    
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}

여기서 requestProductData 와 updatedTransactions 의 하드코딩 된 부분을 적절히 수정해서 사용하면 된다.

또한 구매 성공 또는 취소, 실패 후 앱에 알려줄때는 CCNotificationCenter 같은 걸 사용하면 된다.


이제 테스트에 앞서 iTunes Connect 설정 부분에서도 언급 했지만,

절대 테스트 계정으로는 iTunes, App Store에 로그인해서는 안된다.

그리고 테스트할 Device의 설정 -> Store에서도 Logout 하기 바란다.


init 후에 특정 버튼을 눌러 requestProductData를 호출하게 한 후 실행을 하면..

--

"App 내 구입 확인"

아이템이름 1개를 구입가격에 구입하시겠습니까?

[Environment: Sandbox]

취소       구입

--

이런식으로 창이 뜬다.

(스샷을 올리고 싶지만 팝업창이 반투명이라..;)


구입을 누르면 Apple ID로 Sign In하라는데 여기서 Test User Account를 입력하면 된다.


만약, failedTransaction이 발생하고 transaction.error.code가 5002번 이라면 이는 Simulator에서 테스트를 해서 그런 것이니 Device에서 테스트하시면 된다.


또한 error code가 0번(SKErrorUnknown)이라면 Device에서 앱스토어 로그인이 되어있는지 확인 후 로그아웃 후 다시 시도하시거나 설치된 App을 지우고 한번 시도해보자.


[출처] http://westwoodforever.blogspot.kr/2012/11/cocos2d-x-ios-in-app-purchase.html


?

List of Articles
No. Category Subject Author Date Views
693 Develop [C#] MD5, SHA1 해시 & 인코딩 hooni 2013.04.23 77855
692 Algorithm 디피헬만(Diffie-Hellman) 초간단 개념.. hooni 2013.04.23 81019
691 Develop [c#] 웹문서 소스(html) 긁어오기 file hooni 2013.04.23 24506
690 System/OS [sql] insert into select 사용하기 hooni 2013.04.23 27554
689 Develop [android] 만화 어플 소스코드 file hooni 2013.04.23 92836
688 Develop [ios] 미스터피자(Mr.pizza) 어플 file hooni 2013.04.23 42631
687 Develop [iphone] 아이폰 어플 모음 ㅋㅋ secret hooni 2013.04.23 13707
686 Develop [android] 안드로이드 어플 모음 ㅎㅎ secret hooni 2013.04.23 16340
685 Develop [lego] 세그웨이 이것만 볼것.. ㅎㅎ file hooni 2013.04.23 33536
684 Develop [json] 종결자 (설명과 웹, C/C++/C# 프로그램 샘플 코드) file hooni 2013.04.23 71971
683 Develop [c#] Hashtable <-> Json (dll 포함) file hooni 2013.04.23 80652
682 Develop [c#] Json 라이브러리 (System.Net.Json.dll) file hooni 2013.04.23 58534
681 Develop [c#] 간단한 IPC 통신 예제 hooni 2013.04.23 63726
680 Develop [c#] 간단한 소켓통신 예제.. hooni 2013.04.23 26690
679 Develop [c#] 비동기 통신 샘플 코드 ㅎㅎ file hooni 2013.04.23 23633
678 Develop [c#]업글 뉴 툴바 개인적으로 만든거.. (new) ㅋㅋ secret hooni 2013.04.23 7651
Board Pagination Prev 1 ... 29 30 31 32 33 ... 74 Next
/ 74