1

有没有办法查明用户何时购买非消耗品,是第一次购买还是已经购买并免费再次获得?

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

  • transactionState:(如果用户已经购买了它,则不是SKPaymentTransactionStatePurchasedSKPaymentTransactionStateRestored
  • transactionDate:将交易添加到 AppStore 支付队列的日期。
4

2 回答 2

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 次购买窗口,但每次您尝试购买其中一个时,所有升级都会恢复。

于 2012-10-17T15:54:33.093 回答
0

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

于 2012-10-17T17:02:26.620 回答