Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS应用程序内购买非消耗性产品确定是新购买还是恢复_Ios_In App Purchase_Storekit - Fatal编程技术网

iOS应用程序内购买非消耗性产品确定是新购买还是恢复

iOS应用程序内购买非消耗性产品确定是新购买还是恢复,ios,in-app-purchase,storekit,Ios,In App Purchase,Storekit,有没有办法知道用户何时购买非消费品,是第一次购买还是已经购买并再次免费获得 我检查了交易的transactionState,transactionDate,但在这两种情况下,数据是相同的: transactionState:SkPaymentTransactionState已购买(如果用户已购买,则不恢复SkPaymentTransactionState) 交易日期:将交易添加到应用商店付款队列的日期 您可以检查restoreTransaction方法后将填充的事务数组,如果事务数组为空,则表

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

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

  • transactionState
    SkPaymentTransactionState已购买
    (如果用户已购买,则不恢复SkPaymentTransactionState)
  • 交易日期
    :将交易添加到应用商店付款队列的日期

您可以检查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次,但每次尝试购买其中一个时,所有升级都将恢复。

您可以检查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,请查看此项。希望能有帮助。谢谢你的帮助!不幸的是,我们不能使用它,我们的情况有点复杂…阿尔帕,请看这个。希望能有帮助。谢谢你的帮助!不幸的是我们不能使用它,我们的情况有点复杂。。。