iOS应用程序内购买非消耗性产品确定是新购买还是恢复
有没有办法知道用户何时购买非消费品,是第一次购买还是已经购买并再次免费获得 我检查了交易的iOS应用程序内购买非消耗性产品确定是新购买还是恢复,ios,in-app-purchase,storekit,Ios,In App Purchase,Storekit,有没有办法知道用户何时购买非消费品,是第一次购买还是已经购买并再次免费获得 我检查了交易的transactionState,transactionDate,但在这两种情况下,数据是相同的: transactionState:SkPaymentTransactionState已购买(如果用户已购买,则不恢复SkPaymentTransactionState) 交易日期:将交易添加到应用商店付款队列的日期 您可以检查restoreTransaction方法后将填充的事务数组,如果事务数组为空,则表
transactionState
,transactionDate
,但在这两种情况下,数据是相同的:
:transactionState
(如果用户已购买,则不恢复SkPaymentTransactionState)SkPaymentTransactionState已购买
:将交易添加到应用商店付款队列的日期交易日期
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次,但每次尝试购买其中一个时,所有升级都将恢复。您可以检查restoreTransaction方法后将填充的事务数组,如果事务数组为空,则意味着用户将下载此升级以进行升级第一次。在另一种情况下,您将检查数组中的所有事务,并将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次,但每次尝试购买其中一个时,所有升级都将恢复。不确定,但您可以检查是否存在事务。原始事务
或是否不同。不确定,但您可以检查是否存在交易。原始交易存在或不同。Alpár,请查看此项。希望能有帮助。谢谢你的帮助!不幸的是,我们不能使用它,我们的情况有点复杂…阿尔帕,请看这个。希望能有帮助。谢谢你的帮助!不幸的是我们不能使用它,我们的情况有点复杂。。。