iOS In App Purchase非消费品确定是否新购买或恢复

时间:2011-05-24 12:02:29

标签: ios in-app-purchase storekit

有没有办法找出用户购买非消耗品的时间,如果他是第一次购买或已经购买并再次免费获得?

我检查了交易的transactionStatetransactionDate,但在这两种情况下数据都相同:

  • transactionState SKPaymentTransactionStatePurchased(如果用户已经购买,则不是SKPaymentTransactionStateRestored
  • transactionDate :将交易添加到AppStore的付款队列的日期。

2 个答案:

答案 0 :(得分: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次,但每次尝试购买其中一次升级时,所有升级都会恢复。

答案 1 :(得分:0)

不确定,但也许您可以检查transaction.originalTransacion是否存在或是否不同。