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
Objective c finishTransaction:不';行不通_Objective C_Ios_In App Purchase_Payment - Fatal编程技术网

Objective c finishTransaction:不';行不通

Objective c finishTransaction:不';行不通,objective-c,ios,in-app-purchase,payment,Objective C,Ios,In App Purchase,Payment,我为应用内购买构建了一个项目。下面是部分源代码: - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions { NSLog(@"paymentQueue update"); for (SKPaymentTransaction *transaction in transactions) { switch (transaction.t

我为应用内购买构建了一个项目。下面是部分源代码:

    - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
    NSLog(@"paymentQueue update");
    for (SKPaymentTransaction *transaction in transactions)
    {
        switch (transaction.transactionState)
        {
            case SKPaymentTransactionStatePurchased:
                [self completeTransaction:transaction];
                break;
            case SKPaymentTransactionStateFailed:
                [self failedTransaction:transaction];
                break;
            case SKPaymentTransactionStateRestored:
                [self restoreTransaction:transaction];
            default:
                break;
        }
    }
}

- (void) completeTransaction: (SKPaymentTransaction *)transaction
{
    NSLog(@"completeTransaction");
    // Your application should implement these two methods.
    [self recordTransaction: transaction];
    [self provideContent: transaction.payment.productIdentifier];
    // Remove the transaction from the payment queue.
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}

- (void) restoreTransaction: (SKPaymentTransaction *)transaction
{
    NSLog(@"restoreTransaction");
    [self recordTransaction: transaction];
    [self provideContent: transaction.originalTransaction.payment.productIdentifier];
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}

- (void) failedTransaction: (SKPaymentTransaction *)transaction
{
    NSLog(@"failedTransaction");
    if (transaction.error.code != SKErrorPaymentCancelled)
    {
        // Optionally, display an error here.
    }
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}

//Optional, record the transaction infomation
- (void) recordTransaction: (SKPaymentTransaction *)transaction{

    receipt=transaction.transactionReceipt;

    [[NSUserDefaults standardUserDefaults] setValue:transaction.transactionReceipt forKey:@"proUpgradeTransactionReceipt" ];
    [[NSUserDefaults standardUserDefaults] synchronize];
    [self sendReceipt:receipt];

    expiredTime=transaction.transactionDate;
}
我可以在沙箱中成功添加付款和购买,
但是在执行
finishTransaction:
后,完成的事务不会从defaultQueue中删除。
当我添加付款时,defaultQueue将累积

我犯了什么错误吗?

谢谢你的帮助。

这真是我的错…
每次购买时,我都会复制StoreObserver对象
在我添加了一个防止重复的标志(如下所示)之后,这个bug就被修复了

static bool hasAddObserver=NO;
    -(void) recvPurchase:(NSString *)purchaseString{
        //check user's in-app purchase status
        if ([self CanPurchase]) {
                /*=====================================*/
            if (!hasAddObserver) {//flag to fix this bug
                /*=====================================*/
                observer=[[StoreObserver alloc]init];
                [[SKPaymentQueue defaultQueue] addTransactionObserver:observer];
                hasAddObserver=YES;
            }
            SKPayment *payment = [SKPayment paymentWithProductIdentifier:purchaseString];
            [[SKPaymentQueue defaultQueue] addPayment:payment];
        }
    }