56

我的应用正在使用应用内购买,我的大多数用户都可以正常购买,没有任何问题。对于这些人来说,我的应用会在购买成功后下载内容,他们很高兴。

但是,对于我越来越多的用户来说,一旦他们成功完成应用内购买,之后每次启动应用时都会要求他们输入应用商店密码。我相信这发生在呼吁:

[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

我根据 Apple 应用内购买指南中的第 6 步要求启动:

我的猜测是,出于某种原因,Apple 的应用内购买服务器没有注册交易成功完成 - 即使我打电话

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

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

2个问题:

  1. 还有人看到这个吗?

  2. 有没有人有建议的修复?

赏金编辑

它是使用不同的 Apple-ID 进行的交易。这就是为什么它无法完成,除非您在对话框中输入正确的凭据。问题应该是:

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

14 回答 14

32

我有同样的问题。确保你打电话

[[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 

对于交易的所有三种状态:SKPaymentTransactionStatePurchased、SKPaymentTransactionStateRestored、SKPaymentTransactionStateFailed。

于 2012-06-01T15:25:20.817 回答
8

我遇到了同样的问题,即在通话中出现登录提示:

[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

即使我不使用我的应用程序(在主屏幕或其他应用程序中),它也会时不时出现,这真的很烦人。环顾四周,似乎有很多关于这个问题的建议答案,但我终于从我收集的内容中找到了一个解决方案。

注意:在第 1 步之前,我已经在 iTunes Connect 中删除了测试沙盒帐户。我不确定这是否会影响解决方案。

为了解决这个问题,这就是我所做的:

  1. 从 Xcode 运行您的应用程序。
  2. 等待提示出现。输入所需帐户的密码,然后点击确定。
  3. 按设备上的主页按钮。
  4. 从 Xcode 中杀死应用程序。
  5. 从设备中删除应用程序。
  6. 在“设置”应用中退出 iTunes 和 App Store。
  7. 关闭设备,然后重新打开。
  8. 从 App Store 购买东西。当它提示您时,使用生产 Apple ID 帐户登录。(我假设您应该能够在“设置”应用程序下使用 iTunes 和 App Store 中的生产帐户登录,但我就是这样做的)。
  9. 返回 Xcode 并再次运行您的应用程序。(这应该是新安装,因为您之前删除了该应用程序。)
  10. 等待登录提示出现。
  11. 点击取消。一个对话框说“需要登录。点击继续并登录以检查下载。[环境:沙盒]”应该会出现。这是与以前的一个关键区别。当我在询问我输入密码时按取消时,我从来没有出现过这个对话框。
  12. 点击继续。
  13. 输入帐户的密码。

就是这样。从那时起,每当我运行我的应用程序时,登录提示都会停止出现,并且也会随机停止出现。

希望这可以帮助!

于 2015-08-23T07:01:03.790 回答
8

不要在此处删除答案。正是这个特殊的 Stackoverflow 问题误导了我好几天。

我把它放在这里是因为有很多非常糟糕的答案提供了关于如何解决问题的错误信息。

不要:

  • 删除沙盒测试用户。这使得无法解决问题,您必须联系 Apple 开发人员支持以手动解决。
  • 如果您删除沙盒测试用户,当您随后反复提示您以该用户身份登录并完成事务时,您不能,因此名称为Endless Loop问题。您也无法再次添加已删除的测试用户;开发人员门户网站说用户 ID 已被使用。
  • 删除应用程序或重新安装 iOS 或任何其他此类废话。没有效果,解决不了问题,浪费很多时间。

做:

  • 为所有事务调用 Finish。
  • 如果由于某种原因被中断,只需在应用程序的后续运行中完成。该应用程序将重复发送支付队列通知,直到您对其调用完成:

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

就是这样,完成所有交易!否则,每次您的应用在该设备上启动时,您都会被发送到登录请求的无尽循环地狱。

于 2016-06-12T11:12:00.753 回答
4

有一个问题叫做“无限循环”。在汽车可再生能源的早期,这是一个大问题,大约一周以来,服务器没有将续订限制为 5。获得交易但不调用 finishTransaction 的设备将把该交易交付给设备大约一次直到该特定测试用户登录并调用finishTransaction 一周。如果您切换到飞行模式,您可以在一周内“清除”这些交易 - 但它们会回来。

于 2014-04-01T04:18:53.747 回答
3

我怀疑这是一个正确的行为。当您设置委托时 SKPaymentQueue 尝试检查是否有一些交易需要完成。可能没有未完成的交易,但检查的事实需要登录 iTunes。而且我认为您对此无能为力。

它通常有一定的意义,但对于在每笔交易中设置要求输入密码的用户(例如一些儿童保护)来说,这很烦人。因此,解决它的唯一方法是在您即将请求 iTunes 时明确设置委托。例如,您可以添加一些按钮,例如“恢复我的购买”。不是很漂亮,但绝对不那么烦人。

于 2012-04-09T20:06:40.897 回答
1

我在测试 IAP 时遇到了同样的问题。

我用 3 个测试帐户进行了测试。该应用程序不断要求输入两个帐户的密码。即使我没有触摸任何购买/恢复按钮或addTransactionObserver.

我认为这是因为之前的一些交易没有正确完成,但[[SKPaymentQueue defaultQueue] finishTransaction:transaction];根本无济于事。

所以这就是我为解决这个问题所做的事情:

  1. 输入每个帐户的密码,无论应用商店要求多少次——我为 3 个帐户输入了 6 次——直到它不再要求。
  2. 转到设置并注销Apple ID。
  3. 正常退出应用程序——不要在 Xcode 中终止它。然后杀死任务列表中的进程。
  4. 从设备中删除该应用程序(只需删除该应用程序将无法正常工作,它仍会要求输入密码)
  5. 重启设备
  6. 从 Xcode 再次运行该应用程序/在您的情况下从应用程序商店重新安装该应用程序。

使用 iTunes 测试用户时受预期序列的启发

于 2014-03-26T20:59:24.223 回答
1

以下是我可以始终如一地重现和解决此问题的方法:

iOS 8.4,应用程序的开发版本。

  1. 使用测试(沙盒)Apple 帐户。

  2. 恢复购买的交易。

    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]
    
  3. 立即关闭应用程序。

  4. 退出测试账户(通过设置)

  5. 启动应用程序

现在每次我启动应用程序时,它都会弹出“登录”表单。我是否输入密码都没有关系。我是否进行购买或恢复购买都没有关系。我是否删除并重新安装该应用程序都没关系。每次我启动应用程序时,都会显示 iTune 登录信息。

修复:硬重启设备。

这是我不知道的。这会在生产环境中发生(发布的应用程序和实际的苹果登录)吗?我希望不是。

于 2015-08-07T05:05:34.253 回答
1

如果有人看到这个并且正在使用 GoogleMobileAds.framework 那么您可能还需要致电

[GADMobileAds disableAutomatedInAppPurchaseReporting];

-application:didFinishLaunchingWithOptions:

于 2016-04-14T16:03:57.517 回答
0

删除并重新安装该应用程序将删除与另一个 iTunes 帐户关联的任何旧交易。如果您仍然看到发布到通知队列的事务,那么您的逻辑中可能有一些没有调用 finishTransaction 的分支。

您需要对发布到 paymentQueue:updatedTransactions: 的所有交易调用 finishTransaction,即使是带有 SKPaymentTransactionStateFailed 的交易。

于 2012-05-07T02:18:29.967 回答
0

在 iOS 更新 5.1.1 http://support.apple.com/kb/DL1521中修复的与应用内购买相关的错误

于 2012-05-08T21:30:28.720 回答
0

在我的 viewDidLoad 方法中检查以下内容。当苹果希望我从非消耗品变为消耗品时,我有一个应用被拒绝,但是我在 viewDidLoad 方法中留下了以下行:(我认为密码提示是从测试用户切换到普通用户回到测试用户)

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

一旦删除密码请求停止。

我已经离开了:[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 在应用程序现在已经被批准得很好。

于 2012-08-16T23:25:51.190 回答
0

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

于 2014-01-20T03:35:08.070 回答
0

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

于 2014-05-12T16:42:54.690 回答
0

你说:

但是,对于我越来越多的用户来说,一旦他们成功完成应用内购买,之后每次启动应用时都会要求他们输入应用商店密码。我相信这发生在呼吁:

[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

请注意,文档add(_ observer:/addTransationObserver:声明该调用可能会导致用户通过 App Store 进行身份验证,因此这似乎是预期的行为。

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

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

因此,除了此处的其他答案外,您可能应该停止呼叫add observer,直到您准备好可能显示 App Store 登录提示。

于 2019-10-28T21:39:52.723 回答