在我的iOS应用程序中恢复应用程序购买方法

问题描述:

这些是我实施IAP的第一步,因此对我来说很简单。我必须实现恢复我的应用程序的应用程序按钮,我不知道从哪里开始/修改在我的iOS应用程序中恢复应用程序购买方法

这是我的IAP类

#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该做的一切都是为了你... – mrueg 2013-03-15 13:22:52

+0

由于这是我对IAP第一步Cocoapod,我应该先学习好如何实现所有,然后添加这样的事情。谢谢你的提示! – Vergmort 2013-03-15 13:30:37

只需添加此代码对你的恢复按钮,点击

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

好吗?我正在搜索并发现我应该添加新的方法,如: ' - (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)队列' - (void)paymentQueue:(SKPaymentQueue *)队列restoreCompletedTransactionsFailedWithError:(NSError *)error' – Vergmort 2013-03-15 12:51:27

+0

是当然,只需添加两条线。 – Pradip 2013-03-15 12:57:04

+0

关于' - (void)restoreTransaction:(SKPaymentTransaction *)事务' ? – Vergmort 2013-03-15 12:59:40

使用RMStore对于应用purchase.A轻量级的iOS库,用于在应用程序内Purchases.RMStore增加了块和通知StoreKit,加收汇核销,内容下载和事务持久性。全部在一个没有外部依赖的类中。 将此添加到恢复按钮中。 恢复交易

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