2013-03-15 5 views
1

이것은 IAP를 구현하는 첫 번째 단계이므로 쉽게 생각해보십시오. 나는 구현 내 응용 프로그램에서 응용 프로그램 버튼을 복원하고 난이 내 IAP 클래스iOS 앱에서 앱 구매 방법으로 복원

#import "IAPHelper.h" 

@implementation IAPHelper 
@synthesize productIdentifiers = _productIdentifiers; 
@synthesize products = _products; 
@synthesize purchasedProducts = _purchasedProducts; 
@synthesize request = _request; 

- (id)initWithProductIdentifiers:(NSSet *)productIdentifiers { 
    if ((self = [super init])) { 

     // Store product identifiers 
     _productIdentifiers = [productIdentifiers retain]; 

     // Check for previously purchased products 
     NSMutableSet * purchasedProducts = [NSMutableSet set]; 
     for (NSString * productIdentifier in _productIdentifiers) { 
      BOOL productPurchased = [[NSUserDefaults standardUserDefaults] boolForKey:productIdentifier]; 
      if (productPurchased) { 
       [purchasedProducts addObject:productIdentifier]; 
       NSLog(@"Previously purchased: %@", productIdentifier); 
      } 
      NSLog(@"Not purchased: %@", productIdentifier); 
     } 
     self.purchasedProducts = purchasedProducts; 

    } 
    return self; 
} 

- (void)requestProducts { 

    self.request = [[[SKProductsRequest alloc] initWithProductIdentifiers:_productIdentifiers] autorelease]; 

    [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 

    _request.delegate = self; 
    [_request start]; 
} 

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response { 

    NSLog(@"Received products results..."); 
    NSLog(@"Invalid ...%d", [response.invalidProductIdentifiers count]); 

    if([response.invalidProductIdentifiers count]>0) 
    { 
     return; 
    } 

    self.products = response.products; 
    self.request = nil; 

    SKProduct * proUpgradeProduct = [self.products count] == 1 ? [[self.products objectAtIndex:0] retain] : nil; 
    if (proUpgradeProduct) 
    { 
     NSLog(@"Product title: %@" , proUpgradeProduct.localizedTitle); 
     NSLog(@"Product description: %@" , proUpgradeProduct.localizedDescription); 
     NSLog(@"Product price: %@" , proUpgradeProduct.price); 
     NSLog(@"Product id: %@" , proUpgradeProduct.productIdentifier); 
    } 

    [[NSNotificationCenter defaultCenter] postNotificationName:kProductsLoadedNotification object:_products];  
} 

- (void)recordTransaction:(SKPaymentTransaction *)transaction {  
    // TODO: Record the transaction on the server side...  
} 

- (void)provideContent:(NSString *)productIdentifier { 

    NSLog(@"Toggling flag for: %@", productIdentifier); 

    [[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:productIdentifier]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
    [_purchasedProducts addObject:productIdentifier]; 

    [[NSNotificationCenter defaultCenter] postNotificationName:kProductPurchasedNotification object:productIdentifier]; 

} 

- (void)completeTransaction:(SKPaymentTransaction *)transaction { 

    NSLog(@"completeTransaction..."); 

    [self recordTransaction: transaction]; 
    [self provideContent: transaction.payment.productIdentifier]; 
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 

} 

- (void)restoreTransaction:(SKPaymentTransaction *)transaction { 

    NSLog(@"restoreTransaction..."); 

    [self recordTransaction: transaction]; 
    [self provideContent: transaction.originalTransaction.payment.productIdentifier]; 
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 

} 


- (void)finishTransaction:(SKPaymentTransaction *)transaction wasSuccessful:(BOOL)wasSuccessful 
{ 
    // remove the transaction from the payment queue. 
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 

    NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:transaction, @"transaction" , nil]; 
    if (wasSuccessful) 
    { 
     // send out a notification that we’ve finished the transaction 
     [[NSNotificationCenter defaultCenter] postNotificationName:kInAppPurchaseManagerTransactionSucceededNotification object:self userInfo:userInfo]; 
    } 
    else 
    { 
     // send out a notification for the failed transaction 
     [[NSNotificationCenter defaultCenter] postNotificationName:kInAppPurchaseManagerTransactionFailedNotification object:self userInfo:userInfo]; 
    } 
} 

- (void)failedTransaction:(SKPaymentTransaction *)transaction { 

    if (transaction.error.code != SKErrorPaymentCancelled) 
    { 
     // error! 
     [self finishTransaction:transaction wasSuccessful:NO]; 
    } 
    else 
    { 
     // this is fine, the user just cancelled, so don’t notify 
     [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
    } 
} 

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 
{ 
    for (SKPaymentTransaction *transaction in transactions) 
    { 
     switch (transaction.transactionState) 
     { 
      case SKPaymentTransactionStatePurchased: 
       [self completeTransaction:transaction]; 
       break; 
      case SKPaymentTransactionStateFailed: 
       [self failedTransaction:transaction]; 
       break; 
      case SKPaymentTransactionStateRestored: 
       [self restoreTransaction:transaction]; 
      default: 
       break; 
     } 
    } 
} 

- (void)buyProductIdentifier:(NSString *)productIdentifier { 

    NSLog(@"Buying %@...", productIdentifier); 

    SKPayment *payment = [SKPayment paymentWithProductIdentifier:productIdentifier]; 
    [[SKPaymentQueue defaultQueue] addPayment:payment]; 

} 

- (void)dealloc 
{ 
    [_productIdentifiers release]; 
    _productIdentifiers = nil; 
    [_products release]; 
    _products = nil; 
    [_purchasedProducts release]; 
    _purchasedProducts = nil; 
    [_request release]; 
    _request = nil; 
    [super dealloc]; 
} 

@end 

나는 몇 가지를 읽고 된입니다

을 수정/어디서부터 시작 모르겠지만,의 부분 'updatedTransactions'SKPaymentRestore를 추가 할 때 몇 가지 문제가 있습니다.

누군가 나에게 조언을 해줄 수 있습니까? 읽기/도움 주셔서 감사합니다.

+0

는 또한 당신을 위해 모든 작업을 수행 IAPManager ...이 IAP에 대한 내 첫 번째 단계는 것처럼 – mrueg

+0

라는 Cocoapod있다 거래를 복원 . 팁 고마워! – Vergmort

답변

1

그냥 클릭 복원 버튼이 코드를 추가

[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 
+1

물론 이죠?! 내가 찾고 있었는데 내가 같은 새로운 방법을 추가해야 발견 : '- (void) 지불 QueueRestoreCompletedTransactionsFinished : (SKPaymentQueue *) 큐 ' - (void) 지불 Queue : (SKPaymentQueue *) 큐 restoreCompletedTransactionsFailedWithError : (NSError *) 오류' – Vergmort

+0

예 물론, 두 줄을 추가하십시오. – Pradip

+0

'- (void) restoreTransaction : (SKPaymentTransaction *) transaction'에서 ? – Vergmort

3

사용 RMStore 인앱 Purchases.RMStore위한에서 앱 purchase.A 경량 아이폰 OS 라이브러리 블록 StoreKit에 통지 플러스 영수증 검증, 컨텐츠를 추가하기위한 다운로드 및 트랜잭션 지속성. 외부 종속성없이 하나의 클래스에 모두 있습니다. 복원 버튼에 이것을 추가하십시오. 내가 먼저이 같은 일을 추가 모든를 구현하는 방법을 잘 배우고,해야한다,

 [[RMStore defaultStore] restoreTransactionsOnSuccess:^{ 
    NSLog(@"Transactions restored"); 
    } failure:^(NSError *error) { 
     NSLog(@"Something went wrong"); 
    }];