我的应用程序在IAP沙箱中进入了一些奇怪的状态...每次启动应用程序时都会询问特定测试用户的密码。我想由于未完成的交易。我真的想完成那笔交易,但这是不可能的。一些背景信息以及我为此所做的事情:
[[SKPaymentQueue defaultQueue] addTransactionObserver:self]
[SKPaymentQueue defaultQueue].transactions.count
始终为0
,因此我无法手动完成未完成的交易唯一要做的就是更改捆绑包ID,这在我的情况下是不可取的。希望有人知道如何摆脱未完成的交易。
答案 0 :(得分:9)
我把它放在这里是因为有很多非常糟糕的错误答案提供了关于如何解决这个问题的错误信息。它不是那么罕见,或神秘或Apple漏洞,它是App商店设计的一部分,可帮助您正确构建IAP。
请勿:
<强> DO:强>
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
这是故意的,并预防中断的交易。就是这样!完成所有交易,否则每次你的应用程序在该设备上启动时,你都会被发送到无尽循环地狱,重复请求登录一个不存在的测试用户App Store帐户:(
答案 1 :(得分:0)
您可能需要重复这些步骤几次才能正常工作。 调用事务观察者委托方法后立即完成事务。
- (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循环之前调用完成代码。
答案 2 :(得分:0)
通过调用以下代码执行一次,我再次使用它。最后一次可能会要求您输入密码,但在执行代码后,“驱魔”已完成,您可以再次删除该代码。
#ifdef DEBUG
for (SKPaymentTransaction *transaction in [[SKPaymentQueue defaultQueue] transactions]) {
NSLog(@"finish transactions pending sind last load...");
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
#endif