iOS In-App Purchase 02 Coding
개발을 하기 위해서는 프레임웍을 추가해야 한다.
StoreKit.framework 를 추가하자.
그다음 전역헤더 파일에 추가할 내용이다.
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";
}
}
}
댓글
댓글 쓰기