iOS In-App Purchase 02 Coding

개발을 하기 위해서는 프레임웍을 추가해야 한다.
StoreKit.framework 를 추가하자.

그다음 전역헤더 파일에 추가할 내용이다.
아래와 같이 프레임워크를 임포트 하자.

#import <StoreKit/StoreKit.h>

다음은 델리게이트와 사용할 전역변수를 추가한다.
@interface ADViewController : UIViewController <SKProductsRequestDelegate, SKPaymentTransactionObserver>
{
    SKProductsRequest *productsRequest;
    NSArray *validProcucts;
}

나중에 사용할 메소드를 추가한다.
- (void)fetchAvailableProducts;
- (BOOL)canMakePurchases;
- (void)purchaseMyProduct:(SKProduct *)product;
- (IBAction)purchase:(id)sender;

이제 실행할 m 파일에서 할 내용이다
상수로 아이튠즈에서 설정한 프로덕트아이디를 설정한다.
이는 import 와 interface 사이에 추가하면 된다.
#define kProductID @"com.xxx.xxx.noAd"

이제 실행하면서 구입할 수 있는지 여부를 체크하도록 하자
이는 ViewDidLoad 에 추가했다.
다음과 같이 한 이유는 2초 이후에 실행되도록 지연실행을 걸어준것이다.
[self performSelector:@selector(fetchAvailableProducts) withObject:self afterDelay:2.0];

이제는 다음과 같이 관련 메소드를 추가한다.
여기서 입맛에 맞게 관련내용을 수정한다.
#pragma StoreKit Method
- (void)fetchAvailableProducts
{
    NSLog(@"fetchAvailableProducts");
    NSSet *productIdentifiers = [NSSet setWithObjects:kProductID, nil];
    productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
    productsRequest.delegate = self;
    [productsRequest start];
}

- (BOOL)canMakePurchases
{
    return [SKPaymentQueue canMakePayments];
}

- (void)purchaseMyProduct:(SKProduct *)product
{
    if ([self canMakePurchases]) {
        SKPayment *payment = [SKPayment paymentWithProduct:product];
        [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
        [[SKPaymentQueue defaultQueue] addPayment:payment];
    } else {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Purchases are disabled in your device" message:nil delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alertView show];
    }
}

- (IBAction)purchase:(id)sender
{
    // 구입절차 진행
    [self purchaseMyProduct:[validProcucts objectAtIndex:0]];
}

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
    for (SKPaymentTransaction *transaction in transactions) {
        switch (transaction.transactionState) {
            case SKPaymentTransactionStatePurchasing:
                NSLog(@"Purchasing");
                self.labelPurchaseStatus.text = @"please wait...";
                break;
            case SKPaymentTransactionStatePurchased:
                if ([transaction.payment.productIdentifier isEqualToString:kProductID]) {
                    NSLog(@"Purchased");
                    self.labelPurchaseStatus.text = @"Thank you !!";
                    // 구입여부 설정
                    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
                    [userDefaults setBool:YES forKey:@"Purchase"];
                    [userDefaults synchronize];
                    // 구입완료하면 seque 진행
                    [self performSegueWithIdentifier:@"OpenListViewAD" sender:self];
                }
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                break;
            case SKPaymentTransactionStateRestored:
                NSLog(@"Restored");
                self.labelPurchaseStatus.text = @"please wait...";
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                break;
            case SKPaymentTransactionStateFailed:
                NSLog(@"Purchase failed");
                self.labelPurchaseStatus.text = @"please wait...";
                break;
            default:
                NSLog(@"default");
                self.labelPurchaseStatus.text = @"please wait...";
                break;
        }
    }
}

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
    SKProduct *validPro = nil;
    int count = [response.products count];
    if (count > 0) {
        validProcucts = response.products;
        validPro = [response.products objectAtIndex:0];
        if ([validPro.productIdentifier isEqualToString:kProductID]) {
            NSLog(@"Price:%@", validPro.price);
            // 구입할 있을 경우에만 버튼을 활성화한다
            self.buttonPurchase.enabled = YES;
            self.buttonPurchase.titleLabel.textColor = [UIColor blackColor];
            self.labelPurchaseStatus.text = @"Touch Result !!";
        } else {
            self.labelPurchaseStatus.text = @"No products to purchase";
        }
    }
}

댓글

이 블로그의 인기 게시물

한글 2010 에서 Ctrl + F10 누르면 특수문자 안뜰 때

아이폰에서 RFID 사용하는 방법

VCC 와 GND 는 무엇일까?