objective-c - 完成事务 : doesn't work

标签 objective-c ios in-app-purchase payment

我构建了一个用于应用内购买的项目。部分源码如下:

    - (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 对象
在我添加一个标志以防止重复后(如下),错误被修复。

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];
        }
    }

关于objective-c - 完成事务 : doesn't work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5906204/

相关文章:

ios - 将 CGRect 从 View 转换为 super View 不起作用

ios - 如何知道 UIVIewController 是否显示为 Peek Preview Controller

ios - 基于 GLPaint 的 OpenGL ES 混合问题

ios - 用于以下要求的应用内购买类型

objective-c - iap - 从 objective c 到 swift 的转换

ios - InAppPurchase "Developer Removed from sale"

ios - 将图像从 UITabBarController 传递到 subview (Swift)

iphone - 更改 MFMailComposeViewController 的标题

ios - 需要为使用 Swift 的目标正确配置 “Swift Language Version” (SWIFT_VERSION)

iphone - 自定义导航 Controller 工具栏比 iPhone 底部高一个像素