无法完成付款队列中未完成的交易
我的应用程序在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