在应用内购买之后,启动时 SKPaymentQueue addTransactionObserver 要求输入App Store 的密码。

56

我的应用使用应用内购买,大多数用户可以顺利购买而没有任何问题。对于这些用户,我的应用会在购买成功后下载内容,他们也很满意。

然而,越来越多的用户,在完成一次成功的应用内购买后,每次启动应用程序时都被要求输入他们的App Store密码。我认为这是发生在调用以下函数时:

[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

根据苹果的应用内购买指南中的第6步,我在启动时调用了以下函数:

我猜测是因为某种原因,苹果应用内购买服务器没有成功注册交易完成的事实 - 即使我调用了该方法。

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

当交易完成并且我的内容已经成功下载时。

2个问题:

  1. 还有其他人看到这个问题吗?

  2. 有人有建议的修复方法吗?

悬赏编辑:

这是一个使用不同的Apple-ID进行的交易。因此,除非您在对话框中输入正确的凭据,否则无法完成交易。问题应该是:

  1. 如何防止这种死亡交易(交易未完成,用户没有网络,同时更改了App-ID)?
  2. 如何修剪 SkPaymentQueue

我也遇到了这个问题。 - Aloha Silver
1
它必须依赖于某些已被另一个AppStore帐户中断的交易:http://stackoverflow.com/questions/6971740/in-app-purchase-sign-in-to-itunes-store-after-skpaymentqueue-defaultqueue-a。用户必须尝试他曾经使用过的所有AppStore帐户,如果找到正确的帐户,则不会再出现该消息。但这不能是解决方案。必须确保不会弹出与旧/以前的AppStore帐户相关的任何交易。也许这是苹果的“漏洞”? - Rene Berlin
你在哪里添加了你的事务观察器? - βhargavḯ
@montuno 你最终是如何解决这个问题的? - SAHM
有时测试服务器上的iTunes表现得有点奇怪。在我的应用程序中,当我调用[[SKPaymentQueue defaultQueue] addTransactionObserver:paymentProcessorDelegate];后,它会不停地要求验证。这种情况是偶尔发生的,并且仅在今天出现,因此我期望问题会在以后某个时候“自行解决”。 - bobobobo
苹果公司提供了一些最佳实践:https://developer.apple.com/library/content/technotes/tn2387/_index.html - Cœur
14个回答

0

您说:

然而,对于越来越多的用户,在完成应用内购买后,每次启动应用程序时都会要求他们输入App Store密码。我认为这是在调用以下代码时发生的:

[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

请注意,add(_ observer: / addTransationObserver:文档中指出该调用可能导致用户与App Store进行身份验证,因此这似乎是预期行为。

// 观察者不会被保留。只有队列具有观察者时,事务数组才会与服务器同步。 这可能需要用户进行身份验证。

open func add(_ observer: SKPaymentTransactionObserver)
open func remove(_ observer: SKPaymentTransactionObserver)

因此,除了其他答案之外,您还应该停止调用add observer,直到准备好潜在地显示App Store登录提示。


0

我通过删除与此问题相关的iTunes Connect测试用户帐户来解决它。 应用程序实际上要求再次登录,但然后它就消失了(我还删除了应用程序,重新启动了iPhone并以普通非沙盒用户身份登录,对其他非沙盒应用程序进行了真正的恢复,然后启动了应用程序)


1
这是错误的建议。永远不要删除沙盒测试用户。简单的解决方案是调用[[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 如果您删除了测试用户,则无法执行此操作并进入“无尽循环”的IAP地狱,只能通过TSI解决。 - Cliff Ribaudo
这不是真的 @CliffRibaudo - Maciek Czarnik
是的,这是真的。永远不要试图删除沙盒测试用户来解决不完整的应用内购买问题。请阅读苹果开发者论坛上关于“无尽循环”问题的众多帖子。如果您遵循此方法,实际上会给人们带来问题,因此您应该删除此答案。 - Cliff Ribaudo
@CliffRibaudo,你低估了我的知识,以及有时IAP沙盒表现很奇怪的事实。我知道-finishTransaction:(显然),在大多数情况下它是有效的,但是你在文档中看到的永远不可能100%地反映现实情况。作为一位经验丰富(我相信)的开发者,你应该已经知道这一点了。 - Maciek Czarnik

0

你知道吗,我通过在我的updatedTransactions中进行修改来解决了这个问题。我没有为所有情况添加[[SKPaymentQueue defaultQueue] finishTransaction:transaction];


0

请检查以下内容,因为我在viewDidLoad方法中使用了它。当苹果要求我从非消耗品转换为可消耗品时,我的应用被拒绝了,但我在viewDidLoad方法中保留了以下行:(我认为密码提示是从测试用户切换到普通用户再返回测试用户的问题)

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

一旦删除了密码请求,它就停止了。

而我已经保留了:[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 并且应用程序现在已经完美地获得了批准。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接