有没有办法查明用户何时购买非消耗品,是第一次购买还是已经购买并免费再次获得?
我检查了交易transactionState
,transactionDate
但在这两种情况下,数据都是相同的:
transactionState
:(如果用户已经购买了它,则不是SKPaymentTransactionStatePurchased
)SKPaymentTransactionStateRestored
transactionDate
:将交易添加到 AppStore 支付队列的日期。
有没有办法查明用户何时购买非消耗品,是第一次购买还是已经购买并免费再次获得?
我检查了交易transactionState
,transactionDate
但在这两种情况下,数据都是相同的:
transactionState
:(如果用户已经购买了它,则不是SKPaymentTransactionStatePurchased
)SKPaymentTransactionStateRestored
transactionDate
:将交易添加到 AppStore 支付队列的日期。您可以检查将在 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 次购买窗口,但每次您尝试购买其中一个时,所有升级都会恢复。
不确定,但也许您可以检查是否transaction.originalTransacion
存在或是否不同。