StoreKit.framework 추가
아이튠즈커넥트에서 인앱 아이템 추가 ( 등록하고 사용할 수 있기까지에 시간이 걸립니다 )
인앱 아이템 사용하려면 View Defails에서 InAppPurchase 옆에 Edit버튼을 눌러 추가를 해주어야 합니다.
헤더파일 소스.
#import <Foundation/Foundation.h>
#import <StoreKit/StoreKit.h>
@interface InAppPurchase : NSObject <SKProductsRequestDelegate, SKPaymentTransactionObserver>
-(BOOL)initIAP;
-(void)requestProduceData:(int)idx;
-(void)completeTransaction:(SKPaymentTransaction*)transaction;
-(void)restoreTransaction:(SKPaymentTransaction*)transaction;
-(void)failedTransaction:(SKPaymentTransaction*)transaction;
@property (nonatomic, copy) SKProduct *item;
@property (strong, nonatomic) SKProductsRequest *request;
@end
소스파일 소스
#import "InAppPurchase.h"
#include "cocos2d.h"
#include "UserData.h"
#include "NetService.h"
USING_NS_CC;
@implementation InAppPurchase
-(BOOL)initIAP
{
// inapp use check
if( [SKPaymentQueue canMakePayments] == NO ){
return NO;
}
// Purchase Process delegate register
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
NSLog(@"InappPurchase Init OK ...");
return true;
}
static int jewel_index = 0;
-(void)requestProduceData:(int)idx// item information request
{
NSLog(@" idx %d", idx);
jewel_index = idx;
NSSet *productIdentifiers;
// itunes connect setting item
switch( idx ){
case 0:
productIdentifiers = [NSSet setWithObject:@"app01"];
break;
case 1:
productIdentifiers = [NSSet setWithObject:@"app02"];
break;
case 2:
productIdentifiers = [NSSet setWithObject:@"app03"];
break;
case 3:
productIdentifiers = [NSSet setWithObject:@"app04"];
break;
case 4:
productIdentifiers = [NSSet setWithObject:@"app05"];
break;
case 5:
productIdentifiers = [NSSet setWithObject:@"app23"];
break;
}
self.request = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
self.request.delegate = self;
[self.request start];
}
-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
NSLog(@"InappPurchase didReceiveResponse");
for( SKProduct *product in response.products ){
if( product != nil ){
NSLog(@"Purchase Item title : %@", product.localizedTitle );
NSLog(@"Purchase Item description: %@", product.localizedDescription );
NSLog(@"Purchase Item price: %@", product.price );
NSLog(@"Purchase Item id: %@", product.productIdentifier );
SKPayment *Payment = [SKPayment paymentWithProductIdentifier:product.productIdentifier];
[[SKPaymentQueue defaultQueue] addPayment:Payment];
}
}
[request release];
for( NSString *invalidProductId in response.invalidProductIdentifiers ){
NSLog(@"Purchase Invalid product id:%@", invalidProductId );
}
}
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
for( SKPaymentTransaction *transaction in transactions ){
switch( transaction.transactionState ){
case SKPaymentTransactionStatePurchasing: // transaction request to server
NSLog(@"SKPaymentTransactionStatePurchasing");
break;
case SKPaymentTransactionStatePurchased: // purchase end
{
NSLog(@"Purchase Finished");
[self completeTransaction:transaction];
} break;
case SKPaymentTransactionStateFailed: // purchase failed
NSLog(@"Purchase Failed");
[self failedTransaction:transaction];
break;
case SKPaymentTransactionStateRestored: // re purchase
NSLog(@"Purchase Resotred");
[self restoreTransaction:transaction];
break;
}
}
}
-(void)completeTransaction:(SKPaymentTransaction*)transaction // item information request result
{
NSLog(@"InappPurchase completeTransaction");
// TODO : after purchase complete, game process
NSString *Receipt = transaction.transactionReceipt.base64Encoding;
string sReceipt = [Receipt UTF8String];
CNetService::sharedNetService()->doPostIOSBuyJewel(jewel_index+1, 1, sReceipt );
// 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("failedIAP");
CCLog("InAppPurchase failedTransaction SKErrorPaymentCancelled");
}
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
@end
여기서
productIdentifiers = [NSSet setWithObject:@"app01"];
"app01"은 웹에서 추가한 아이디를 입력하시면 됩니다.
사용:
InAppPurchase *inapp;
inapp = [[InAppPurchase alloc] init];
[inapp initIAP];
[inapp requestProduceData:index]; // 해당하는 인덱스 인앱 결제 아이템 구매 API가 호출됩니다.