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

我的应用程序在IAP沙盒中进入了一些奇怪的状态…每次启动应用程序时,都会要求input特定testing用户的密码。 我猜是因为未完成的交易。 我真的想完成那笔交易,但这是不可能的。 一些背景信息和我已经做了什么:

  • 我已经从itunesconnect删除了该testing用户
  • 一旦应用程序启动,我调用[[SKPaymentQueue defaultQueue] addTransactionObserver:self]
  • input特定testing用户的密码后,没有收到付款队列更新通知,或点击取消
  • [SKPaymentQueue defaultQueue].transactions.count始终是0 ,所以我不能手动完成未完成的事务
  • 我已经从设备上删除应用程序,重新启动设备 – 仍然要求input密码
  • 我正在从设置 – > iTunes&App Store注销用户
  • 当我取消对话框要求input密码后,不知何故,我可以用另一个testing用户login,但是下次我仍然得到旧testing用户的密码对话框。

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

我把这个放在这里,因为有很多非常糟糕的答案,那里提供错误信息如何解决这个问题。 这不是罕见的,或神秘的或苹果的错误,它是应用程序商店devise的一部分,并帮助你build立正确的IAP。

不要:

  • 永远,永远,永远删除沙箱testing用户。 这使得解决问题成为不可能的事情,直到事务最终消失,你将陷入无尽的循环地狱……它会消失,但是需要很长时间,比如几天或几周。
  • 如果您删除了沙箱testing用户,当您随后反复提示(如每次您的应用程序设置IAP)以login到testing用户商店帐户以完成交易时,您不能因为用户已被删除。 你也不能把testing用户加回去,因为开发者门户会说用户ID 已经被使用了
  • 不要: 删除应用程序重新安装iOS或任何其他类似的BS。 没有效果,没有解决问题,浪费了很多时间。

做:

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

而已! 完成所有的交易,否则你会被发送到无尽的循环地狱的重复请求login到一个不存在的testing用户的App Store帐户每次你的应用程序启动该设备:(

您可能需要重复这些步骤几次才能正常工作。 一旦你的事务观察者委托方法被调用完成事务。

 - (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; } */ } } 

现在运行该应用程序并使用已删除的沙箱帐户login。 上面的方法应该立即启动并完成交易。 如果事务数组为零,请尝试在FOR循环之前调用完成代码。

通过调用下面的代码来执行一次,我得到了这个工作。 您可能会被要求input密码,但在代码执行后,“驱魔”完成,您可以自由删除代码。

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