问题 无法在付款队列中完成未完成的交易


我的应用程序在IAP沙箱中进入了一些奇怪的状态...每次启动应用程序时都要求特定测试用户的密码。我想由于未完成的交易。我真的想完成那笔交易,但这是不可能的。一些背景信息以及我为它做了些什么:

  • 我从itunesconnect删除了该测试用户
  • 一旦应用程序启动,我就打电话 [[SKPaymentQueue defaultQueue] addTransactionObserver:self]
  • 在我输入该特定测试用户的密码或点击取消后,没有收到付款队列更新通知
  • [SKPaymentQueue defaultQueue].transactions.count 总是 0,所以我不能手动完成未完成的交易
  • 我从设备删除应用程序,重新启动设备 - 仍然要求输入密码
  • 我从“设置” - >“iTunes和App Store”中注销了用户
  • 取消对话框询问密码后,我可以用另一个测试用户登录,但下次我仍然得到旧测试用户密码的对话框。

唯一的问题是改变bundle id,这在我的情况下是不可取的。希望有人知道如何摆脱未完成的交易的替代方法。


7768
2018-04-12 09:12


起源

这似乎是沙盒中罕见的“无限循环”问题。 - Pablo
你有第二个设备试试吗?你在Xcode中试过干净吗?在此问题出现之前,您可以尝试从备份中重新安装设备iOS或iTunes吗?这是在飞机模式下发生的吗? - Chris Prince
没有其他设备。是的,我试图清理Xcode。我现在无法恢复,并且在飞行模式下不会发生。我计划联系苹果来清理这个无限循环 - Pablo
@pablo您有没有找到任何解决方案......? Becoz现在我也遇到了同样的问题,我做了你上面所做的所有事情,但没有好运。 - Dinesh Reddy Chennuru
切换到我的应用程序的其他包ID。 Apple承诺回答但从未给出任何答案。 - Pablo


答案:


我把它放在这里是因为有很多非常糟糕的错误答案提供了如何解决这个问题的错误信息。它不是那么罕见,或神秘或Apple漏洞,它是App商店设计的一部分,可帮助您正确构建IAP。

不要:

  • 曾经永远删除沙盒测试用户。这使得无法解决问题,您将进入 无尽的循环 地狱直到交易最终消失......它确实消失了,但需要很长时间,比如几天或几周。
  • 如果删除沙盒测试用户,则随后会反复提示(例如,每次应用程序设置IAP)以登录测试用户存储帐户  在事务中,您不能因为用户已被删除。您也无法添加测试用户,因为开发人员门户会说用户ID 已被使用过
  • 不要: 删除应用程序 要么 重新安装iOS 或任何其他此类BS。它没有效果,没有解决问题,浪费了很多时间。

做:

  • 呼叫  在所有交易上。如果由于某种原因中断了一个,只需在App的后续运行中完成。该应用程序将重复发送支付队列通知,直到您呼叫完成,让您有机会打电话 [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 这是故意的,并且是对中断交易的预警。

而已!完成所有交易,否则每次你的应用程序在该设备上启动时,你都会被发送到Endless Loop地狱,重复请求登录一个不存在的测试用户App Store帐户:(


9
2018-06-11 09:51



我希望在删除沙盒用户之前我已在此处阅读您的评论;-) - Peter Grundner
Mwahahahah。是的,这就是我试图警告人们的事情。如果你这样做......非常糟糕的joujou。 - Cliff Ribaudo
但问题是,即使我在所有事务上调用完成,它也会在事务队列中保留很长时间。 - KarenAnne
?没有关注。如果你完成那么它应该被清除。如果您仍然收到通知,那么您没有完成所有交易。 - Cliff Ribaudo
我认为你应该提到你应该完成交易,而不是在回调中等待,而是直接枚举队列中的交易。这是它对我有用的唯一方式。 - TalL


您可能需要重复这些步骤几次才能工作。 调用事务观察者委托方法后立即完成事务。

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{    
    for (SKPaymentTransaction *transaction in transactions) {

        // Temporary code to solve the loop issue
        [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

        /*
        switch (transaction.transactionState) {
        // Call the appropriate custom method.
        case SKPaymentTransactionStatePurchased:
            [self completeTransaction:transaction];
            break;
        case SKPaymentTransactionStateFailed:
            [self failedTransaction:transaction];
            break;
        case SKPaymentTransactionStateRestored:
        default:
            break;
        }
        */
    }
}

现在您运行应用程序并使用已删除的沙盒帐户登录。上述方法应立即触发并完成交易。如果transactions数组为nil,请尝试在FOR循环之前调用完成代码。


0
2017-10-28 10:58





通过调用以下代码执行一次,我再次使用它。最后一次可能会要求您输入密码,但在执行代码后,“驱魔”已完成,您可以再次删除该代码。

#ifdef DEBUG
    for (SKPaymentTransaction *transaction in [[SKPaymentQueue defaultQueue] transactions]) {
        NSLog(@"finish transactions pending sind last load...");
        [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
    }
#endif

0
2018-06-29 11:03