有没有办法找出用户购买非消耗品的时间,如果他是第一次购买或已经购买并再次免费获得?
我检查了交易的transactionState
,transactionDate
,但在这两种情况下数据都相同:
transactionState
:SKPaymentTransactionStatePurchased
(如果用户已经购买,则不是SKPaymentTransactionStateRestored
)transactionDate
:将交易添加到AppStore的付款队列的日期。答案 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
是否存在或是否不同。