2011-05-24 126 views
1

有沒有辦法找出用戶何時購買非消耗品,如果他是第一次購買它或已經購買並重新購買免費?iOS In App購買非消耗品確定新購買還是恢復

我查transactionStatetransactionDate交易的,但在這兩種情況下,數據是一樣的:

  • transactionStateSKPaymentTransactionStatePurchased(而不是SKPaymentTransactionStateRestored的情況下,對用戶購買它的話)
  • transactionDate:交易被添加到AppStore的支付隊列的日期。
+0

Alpár, 請看看這個[thread](http://stackoverflow.com/questions/5623652/differentiating-between-initial-buy-and-free-re-buy-in-storekit-in-應用程序購買)。希望能幫助到你。 Markus – 2011-05-29 04:58:01

+0

謝謝你的幫助!不幸的是,我們不能使用它,我們的情況有點複雜... – 2011-08-30 14:43:40

回答

1

您可以檢查將在restoreTransaction方法後填充的事務數組,如果事務數組爲空,則表示用戶首次下載此升級。在另一種情況下,您將檢查Array中的所有交易,並將transaction.payment.productIdentifier與需要的產品標識進行比較。如果不存在,請在交易數組中添加付款。

對於非消耗型應用程序內購買我用下面的代碼:

#define kInAppPurchaseProUpgradeProductId @"upgradeProductId" 

//... 
//your payment code for all SKPaymentTransactionStates 
//... 

//method called when BUY button press 
-(void)purchaseProUpgrade{ 
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 
} 
//when restore completed delegate method calls 
-(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue{ 

    if([[[SKPaymentQueue defaultQueue] transactions] count]==0)    
     [self addNewPaymentForProductId:kInAppPurchaseProUpgradeProductId]; 
    else    
     for (SKPaymentTransaction *transaction in [[SKPaymentQueue defaultQueue] transactions]){ 

      if (![transaction.payment.productIdentifier isEqualToString:kInAppPurchaseProUpgradeProductId]){ 
       [self addNewPaymentForProductId:kInAppPurchaseProUpgradeProductId]; 
       break; 
      } 
     }  
} 

-(void)addNewPaymentForProductId:(NSString *)productId{ 
    if([SKPaymentQueue canMakePayments]){ 
     SKPayment *payment = [SKPayment paymentWithProductIdentifier:productId]; 
     [[SKPaymentQueue defaultQueue] addPayment:payment]; 
    } 
} 

唯一的缺點是,每次你打電話restoreCompletedTransactions時,窗口會彈出要求你輸入當前用戶的密碼。此解決方案可確保每次升級時購買窗口的出現次數不會超過1次,但每次嘗試購買其中一次時,所有升級都會恢復。

+0

感謝您的答案! – 2013-01-18 09:16:38

0

不確定,但也許你可以檢查是否存在transaction.originalTransacion或如果不同。