【问题标题】:SKPaymentQueue addTransactionObserver asking for App Store password on startup after in-app purchaseSKPaymentQueue addTransactionObserver 在应用内购买后启动时询问 App Store 密码
【发布时间】:2011-02-14 03:45:35
【问题描述】:

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

但是,对于我越来越多的用户而言,一旦他们成功完成应用内购买,之后每次启动应用时都会要求他们输入 App Store 密码。我相信这发生在以下电话中:

[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

我根据 Apple 应用内购买指南中的第 6 步在启动时调用:

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

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

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

2 个问题:

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

  2. 有人有修复建议吗?

赏金编辑

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

  1. 如何防止此类死交易(交易未完成,用户无网络,同时更改App-ID)?
  2. 如何修剪SkPaymentQueue

【问题讨论】:

  • 我也遇到过这种情况。
  • 它必须依赖于某个已被另一个 AppStore-Account 中断的事务:stackoverflow.com/questions/6971740/…。用户必须尝试他曾经使用过的所有 AppStore-Accounts,如果他找到了正确的,该消息将不会再次出现。但这不可能是解决方案。已确保不会弹出与旧/以前的 AppStore-Accounts 的交易。也许那是苹果的“Bug”?
  • 你在哪里添加了你的事务观察者?
  • @montuno 你是怎么解决这个问题的?
  • 测试服务器上的 iTunes 有时会有点不稳定。在我的应用程序中,在我拨打[[SKPaymentQueue defaultQueue] addTransactionObserver:paymentProcessorDelegate]; 后,它会不断要求验证。它偶尔会这样做,仅在今天,所以我期待这个问题稍后会以某种方式“自行修复”。

标签: iphone app-store itunes in-app-purchase passwordbox


【解决方案1】:

我遇到了同样的问题。请确保您致电

[[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 

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

【讨论】:

  • 是的,但我什至没有得到任何交易。我什至为每个5 SKPaymentTransactionObserver delegate methods 插入了代表。 iTunes 商店要求我登录每次我现在启动我的应用程序..
  • 被同样的问题困扰,这对我帮助很大!
  • 情况:您已经注册了一些 testuser1@t.com 并用它测试了 IAP,但没有完成一些交易。然后你注册了 testuser2@t.com。因此,如果您打开应用程序(想使用 testuser2@t.com 对其进行测试),您将看到带有 testuser1@t.com 输入凭据的对话框!即使您从 ITC 中删除了 testuser1@t.com 用户 - 此对话框将再次出现,直到您为旧用户 (testuser1@t.com) 输入正确的凭据。以后这个对话框就不会出现了!它对我有用
【解决方案2】:

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

[[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. 输入帐户密码。

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

希望这会有所帮助!

【讨论】:

  • 为我工作。步骤 11 到 13 是解决问题的关键步骤。我不确定触发它需要步骤 1 到 10 中的哪个或多少。作为记录,我没有删除测试沙盒帐户(第 0 步),也没有从 App Store 购买任何东西(第 8 步)。不过,我确实在“设置”中使用生产帐户登录(如步骤 8 中所建议)。
  • 我只做了 1 到 10,然后在第 11 步中,我点击了取消,就是这样。它确实有效 :)
  • #11 是关键!
  • addTransationObserver: 的文档声明“这可能需要用户进行身份验证。” - 因此,如果您调用该方法,这似乎是正确/预期的行为。
【解决方案3】:

请勿在此处删除答案。正是这个特殊的 Stackoverflow 问题误导了我,让我好几天都搞砸了。

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

不要:

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

做:

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

[[SKPaymentQueue defaultQueue]finishTransaction:transaction];

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

【讨论】:

  • 不太清楚为什么人们不赞成这个?!显然,投反对票的人要么对事实一无所知,要么只是怀恨在心。作为一名资深的 iOS 开发人员和最近被“删除测试用户”的答案之一严重搞砸的人,我向你保证,不要这样做。
  • 我猜人们会否决,因为没有足够清楚地说明您建议在测试/调试时将所有事务作为临时解决方案完成。其他一些人可能会使用您的建议,并且他们的应用程序将投入生产,并立即清除 .deferred 或 .purchasing 状态(这对生产中的应用程序不利)。
  • 你在说什么?!我不建议完成交易是一个临时的解决方案。无论是在测试还是生产中,都必须始终完成交易......所以如果你投了反对票,也许你应该重新考虑一下,或者告诉我它表明它是临时的确切位置。
  • 克里夫,我没有投反对票。我投了赞成票,因为你的回答对我有帮助。答案是大胆的,这就是为什么我猜测你的问题“为什么 ppl downvoting?”......你绝对正确,应用程序应该以这样一种方式设计(并经过良好测试),以使所有交易最终都完成毕竟,否则事情会变糟。我的猜测是,有些人可能已经从字面上阅读了您的建议 - 他们可以尝试立即完成 paymentQueue(_:updatedTransactions:) 中的所有内容并且感到失望,因为他们正在完成处于“购买”和“延期”状态的交易。跨度>
  • 好的,我现在明白了;)有些人出于某种原因投了反对票。不知道为什么,因为它实际上是最正确的答案。很多开发者遇到麻烦的第一反应就是删除沙盒用户,那就麻烦了。
【解决方案4】:

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

【讨论】:

  • 这听起来与我在汽车可再生能源出现之前就存在的问题非常相似。不幸的是,这些弹出窗口与我的个人主帐户相关联,所以我让它们每周出现一次或更多次,我不得不按 30-50 次取消,然后它们就放弃了。多年后,我能够通过回到过去用于测试 IAP 实现的测试应用程序来修复它。使用相同的捆绑标识符再次创建该应用程序,我能够捕获一些非常古老的未完成事务,完成它们,然后我几年遇到的问题就消失了。
【解决方案5】:

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

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

【讨论】:

  • 我实际上对我帮助开发的应用程序做了同样的事情。可能是最简单的解决方案。
【解决方案6】:

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

[GADMobileAds disableAutomatedInAppPurchaseReporting];

-application:didFinishLaunchingWithOptions:

【讨论】:

    【解决方案7】:

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

    iOS 8.4,应用的开发版本。

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

    2. 恢复购买的交易。

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

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

    5. 启动应用

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

    修复:硬重启设备。

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

    【讨论】:

      【解决方案8】:

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

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

      我认为这是因为之前的一些交易没有正确完成,但[[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 完全帮不上忙。

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

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

      灵感来自Expected sequence when using iTunes test user

      【讨论】:

        【解决方案9】:

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

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

        【讨论】:

        • 不,不是!不好的建议。不要这样做。
        【解决方案10】:

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

        【讨论】:

          【解决方案11】:

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

          [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
          

          一旦删除密码请求停止。

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

          【讨论】:

            【解决方案12】:

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

            【讨论】:

              【解决方案13】:

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

              【讨论】:

              • 这是个坏建议。永远不要删除沙盒测试用户。简单的解决方案是调用 [[SKPaymentQueue defaultQueue] finishTransaction:transaction];如果您删除了测试用户,您将无法执行此操作并进入只能通过 TSI 解决的“无限循环”IAP 地狱
              • 那不是真的@CliffRibaudo ?
              • 是的,这是真的。永远,永远,永远,删除沙盒测试用户以尝试解决不完整的 IAP。阅读 Apple 开发者论坛上关于“无尽循环”问题的大量帖子。您实际上应该删除此答案,因为它会给关注它的人带来问题。
              • @CliffRibaudo 你低估了我的知识和事实,有时 IAP 沙盒行为很奇怪。我知道 -finishTransaction: (显然)并且在大多数情况下它都有效,但是您在文档中看到的永远、永远、永远 100% 它在现实中的样子。实际上,作为一名经验丰富的(我相信)开发人员,您应该知道这一点
              【解决方案14】:

              你说:

              但是,对于我越来越多的用户而言,一旦他们成功完成应用内购买,之后每次启动应用时,他们都会被要求输入 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 登录提示。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-05-16
                • 2015-06-30
                • 2021-07-09
                • 2017-11-29
                相关资源
                最近更新 更多