본문으로 바로가기

ios xcode in app purchase example

category (IT)Program / IOS 2017. 2. 8. 20:28

안녕하세요. 날씨가 추운 가운데 다들 잘 지내시는지요. 요새는 어플에 광고는 필수적으로 들어가는거라 

오늘은 ios에 광고를 다는 in app purchase(결제)를 알아보도록 하려고 합니다. 

지금 기본 코드만 가지고 설명 하려고 합니다. 실전에 쓸대 편하고 쉽게 익힐수 있도록 보여드리도록 하겠습니다.

코드만 가져다 쓰시면 바로 사용 하실수 있습니다.


#pragma mark - in app delegate


- (BOOL) initIAP

{

    ///< 인앱 결제 시스템을 사용 가능한지 체크

    if( [SKPaymentQueue canMakePayments] == NO )

        return NO;

    

    ///< Product 결제 진행에 필요한 딜리게이트 등록

    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];

    

    NSLog(@"InAppPurchase init OK");

    return true;

}


///< 아이템 정보 요청

- (void) requestProductData

{

    ///< iTunes Connect 설정한 Product ID 입니다. ex)pay01 

    NSSet* productIdentifiers = [NSSet setWithObject:@" pay01"];

    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];

        }

    }

    

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

    ///< 구매 완료 아이템 인벤등 게임쪽 처리 진행

   


    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

}


- (void) restoreTransaction:(SKPaymentTransaction *)transaction

{

    NSLog(@"InAppPurchase restoreTransaction");

    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

}


- (void) failedTransaction:(SKPaymentTransaction *)transaction

{

    NSLog(@"InAppPurchase failedTransaction." );

    NSString* pStrFailed = 0;

    if( transaction.error.code != SKErrorPaymentCancelled )

    {

        pStrFailed = @"faileIAP";

        NSLog(@"InAppPurchase failedTransaction SKErrorDomain - %d",

              transaction.error.code );

    }

    else

    {

        pStrFailed = @"cancelIAP";

        NSLog(@"InAppPurchase failedTransaction SKErrorPaymentCancelled");

    }

    ///< 실패나 취소에 대한 것을 게임쪽에 알려준다.

    

    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

}

/// 구매된 상품이 있는지 여부확인

- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue{

   

}


/// 실패 되었을때 호출된다.

- (void) callDelegateFail:(NSString *) reason {

    

}


- (void) paymentRequest:(SKProduct *) product

{

    SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:product];

    payment.quantity = 1;

    

    [[SKPaymentQueue defaultQueue] addPayment:payment];

    // 이후 Apple 결제 UI 보인다. SKPaymentTransactionObserver 구현해서 적절한 처리를 해주어야 한다.

}


결제버튼을 눌렀을떄

호출 --> [self requestProductData];


복구버튼을 눌렀을떄

호출 --> [[SKPaymentQueue defaultQueuerestoreCompletedTransactions]; 

                         호출되는 함수 --> paymentQueueRestoreCompletedTransactionsFinished



이렇게 코드를 짜시면 금방 in app purchase(결제)를 사용하실수 있습니다.