我知道这是一个老话题,但是我很难找到解决方案,并且经历了一些令人麻木的试验和错误,直到我找到了解决方案,所以我想我会在这里分享它,因为我无法在任何地方找到它否则。
首先,确保在您调用的每笔交易之后:
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
在我的情况下发生的事情是交易没有完成并且一直在队列中,所以即使我切换到不同的沙盒帐户,它仍然会继续询问我的旧帐户密码。
为了修复它,我添加了:
SKPaymentQueue *queue = [SKPaymentQueue defaultQueue];
for (SKPaymentTransaction *transaction in queue.transactions) {
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
在我添加事务观察器之前,即:
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
另外,在
(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
函数,我加了这行代码:
[queue finishTransaction:transaction];
在 switch 语句的 SKPaymentTransactionStateRestored 和 SKPaymentTransactionStateFailed 情况下。不要将其添加到购买状态,因为据我所知,您不允许调用完成。
我不确定上述两个步骤中的哪一个修复了该错误,因为它一直存在,直到我退出我的 iPhone、删除应用程序、关闭它并进行了干净的重建/安装,但它最终停止询问我被窃听帐户的密码。希望这可以帮助某人。
编辑:(2015 年 11 月 12 日)
所以我找到了破坏沙盒帐户的原因。它发生在恢复购买后,然后点击主页键,重新打开并再次点击恢复按钮导致崩溃。恢复保留在队列中,上述过程是退出询问密码的弹出窗口的唯一方法。
为了阻止这种情况,我补充说:
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
在我取消应用内购买管理器对象之前,通过我的主视图控制器的 tearDown 函数(由 applicationDidEnterBackground 调用:)。我认为发生的事情是我不止一次地将对象添加为事务观察者,这导致了奇怪的行为。从外观上看,这似乎完全解决了问题,因为我无法再次重新创建错误。