2013-03-15 103 views
1

這些是我實施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

回答

1

只需添加此代碼對你的恢復按鈕,點擊

[[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

3

使用RMStore對於應用purchase.A輕量級的iOS庫,用於在應用程序內Purchases.RMStore增加了塊和通知StoreKit,加收匯覈銷,內容下載和事務持久性。全部在一個沒有外部依賴的類中。 將此添加到恢復按鈕中。 恢復交易

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