SKPaymentQueue finishTransactions 不从队列中删除交易

时间:2021-04-16 23:06:43

标签: ios in-app-purchase storekit

updatedTransactions: 委托回调正在触发几天前的旧事务。我尝试对它们调用 finishTransactions,但是当我启动应用程序时,相同的交易仍然存在(检查 transactionIdentifier)一遍又一遍。

我无法进行任何新购买。进行新购买时,这些旧交易之一将在 SKPaymentTransactionStatePurchased 状态下返回,但由于之前已经成功,我收到来自 Apple 的错误消息:“此应用内购买已被已购买。它将免费恢复。[环境:沙盒]"

Error message

如何从事务队列中正确删除事务?

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions {

    // Getting called with old, already finished transactions

    for (SKPaymentTransaction *transaction in transactions) {
        switch (transaction.transactionState) {
            case SKPaymentTransactionStatePurchasing:
                break;
            case SKPaymentTransactionStateDeferred:
                // ...
                break;
            case SKPaymentTransactionStateFailed:
                // ...
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                break;
            case SKPaymentTransactionStatePurchased:
                // validate receipt first
                // then finish transaction
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                break;
            case SKPaymentTransactionStateRestored:
                // ...
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                break;
            default:
                break;
        }
    }
}

编辑:

我确认 finishTransactions 不会将它们从队列中删除。

NSArray<SKPaymentTransaction *> *transactions = [[SKPaymentQueue defaultQueue] transactions];
NSLog(@"BEFORE transactions = %@", transactions);
for (SKPaymentTransaction *txn in transactions) {
    [[SKPaymentQueue defaultQueue] finishTransaction:txn];
}
transactions = [[SKPaymentQueue defaultQueue] transactions];
NSLog(@"AFTER transactions = %@", transactions);

输出:

BEFORE transactions = (
    "<SKPaymentTransaction: 0x2802c8b10>",
    "<SKPaymentTransaction: 0x2802c8c60>",
    "<SKPaymentTransaction: 0x2802c8c40>",
    "<SKPaymentTransaction: 0x2802c8c20>",
    "<SKPaymentTransaction: 0x2802c8b00>"
)
AFTER transactions = (
    "<SKPaymentTransaction: 0x2802c8b10>",
    "<SKPaymentTransaction: 0x2802c8c60>",
    "<SKPaymentTransaction: 0x2802c8c40>",
    "<SKPaymentTransaction: 0x2802c8c20>",
    "<SKPaymentTransaction: 0x2802c8b00>"
)

编辑 #2:

我在 Apple 开发者论坛上发现,这在过去 48 小时内影响了其他一些人。我认为这是 Apple 方面的问题。

编辑 #3:

我们通过合作伙伴团队联系了 Apple,并确认 Apple 的服务在此期间确实出现了故障,但问题已得到解决。

2 个答案:

答案 0 :(得分:0)

首先,您需要将所有 purchasedrestoredfailed 交易标记为 finished,而不仅仅是 purchased 交易。

要重新开始一个空的交易队列,我建议您将以下行添加到您的商店组件或您处理购买的任何地方的初始化代码中:

SKPaymentQueue.default().transactions.forEach({ SKPaymentQueue.default().finishTransaction($0) })

这会将所有当前打开的事务标记为已完成,并允许您从一个空的事务队列重新开始。

答案 1 :(得分:0)

finishTransaction: 方法应该做你想要实现的。但是,您测试行为的方式并不正确,因为 StoreKit paymentQueue:removedTransactions: 有另一个委托方法来获取已删除的交易。

finishTransaction: 和实际移除之间可能存在少量延迟。因此,如果在 [[SKPaymentQueue defaultQueue] transactions]

之后直接调用 finishTransaction: 仍然可以返回交易

我建议您使用委托方法验证交易的删除。

相关问题