我的应用程序在IAP沙箱中进入了一些奇怪的状态...每次启动应用程序时都要求特定测试用户的密码。我想由于未完成的交易。我真的想完成那笔交易,但这是不可能的。一些背景信息以及我为它做了些什么:
- 我从itunesconnect删除了该测试用户
- 一旦应用程序启动,我就打电话
[[SKPaymentQueue defaultQueue] addTransactionObserver:self]
- 在我输入该特定测试用户的密码或点击取消后,没有收到付款队列更新通知
[SKPaymentQueue defaultQueue].transactions.count
总是 0
,所以我不能手动完成未完成的交易
- 我从设备删除应用程序,重新启动设备 - 仍然要求输入密码
- 我从“设置” - >“iTunes和App Store”中注销了用户
- 取消对话框询问密码后,我可以用另一个测试用户登录,但下次我仍然得到旧测试用户密码的对话框。
唯一的问题是改变bundle id,这在我的情况下是不可取的。希望有人知道如何摆脱未完成的交易的替代方法。
我把它放在这里是因为有很多非常糟糕的错误答案提供了如何解决这个问题的错误信息。它不是那么罕见,或神秘或Apple漏洞,它是App商店设计的一部分,可帮助您正确构建IAP。
不要:
- 曾经永远删除沙盒测试用户。这使得无法解决问题,您将进入 无尽的循环 地狱直到交易最终消失......它确实消失了,但需要很长时间,比如几天或几周。
- 如果删除沙盒测试用户,则随后会反复提示(例如,每次应用程序设置IAP)以登录测试用户存储帐户 完 在事务中,您不能因为用户已被删除。您也无法添加测试用户,因为开发人员门户会说用户ID 已被使用过。
- 不要: 删除应用程序 要么 重新安装iOS 或任何其他此类BS。它没有效果,没有解决问题,浪费了很多时间。
做:
- 呼叫 完 在所有交易上。如果由于某种原因中断了一个,只需在App的后续运行中完成。该应用程序将重复发送支付队列通知,直到您呼叫完成,让您有机会打电话
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
这是故意的,并且是对中断交易的预警。
而已!完成所有交易,否则每次你的应用程序在该设备上启动时,你都会被发送到Endless Loop地狱,重复请求登录一个不存在的测试用户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;
}
*/
}
}
现在您运行应用程序并使用已删除的沙盒帐户登录。上述方法应立即触发并完成交易。如果transactions数组为nil,请尝试在FOR循环之前调用完成代码。
通过调用以下代码执行一次,我再次使用它。最后一次可能会要求您输入密码,但在执行代码后,“驱魔”已完成,您可以再次删除该代码。
#ifdef DEBUG
for (SKPaymentTransaction *transaction in [[SKPaymentQueue defaultQueue] transactions]) {
NSLog(@"finish transactions pending sind last load...");
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
#endif