SKPaymentQueue addTransactionObserver在应用内购买后在启动时询问App Store密码

时间:2011-02-14 03:45:36

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

我的应用正在使用应用内购买,我的大多数用户都可以毫无问题地购买。对于这些人,我的应用程序在购买成功后下载内容,他们很高兴。

但是,对于越来越多的用户,一旦他们完成了成功的应用内购买,他们就会在每次应用启动后被要求提供App Store密码。我相信这发生在致电:

[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

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

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

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

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

2个问题:

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

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

  3. BOUNTY EDIT

    这是一个使用不同Apple-ID制作的交易。这就是为什么除非你在对话框中键入正确的凭据,否则无法完成。问题应该是:

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

15 个答案:

答案 0 :(得分:31)

我遇到了同样的问题。请确保你打电话

[[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 

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

答案 1 :(得分:6)

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

[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

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

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

要解决这个问题,我就是这样做的:

  1. 从Xcode运行您的应用。
  2. 等待提示出现。输入所需帐户的密码,然后点按“确定”。
  3. 按设备上的主屏幕按钮。
  4. 从Xcode中杀死该应用程序。
  5. 从设备中删除应用程序。
  6. 退出iTunes& App Store中的App Store。
  7. 关闭设备,然后重新打开。
  8. 从App Store购买商品。当它提示您时,请使用生产Apple ID帐户登录。 (我假设您应该只能使用“设置”应用下的iTunes& App Store中的生产帐户登录,但这就是我的操作方式。)
  9. 返回Xcode并再次运行您的应用。 (这应该是一个新安装,因为之前删除了应用程序。)
  10. 等待登录提示出现。
  11. 点按取消。一个对话框说“需要登录。点击继续并登录以检查下载。[环境:沙箱]”应该出现。这是与以前的关键区别。当我在向我询问密码时按下“取消”时,我从未出现过此对话框。
  12. 点按“继续”。
  13. 输入帐户的密码。
  14. 就是这样。从那时起,每当我运行我的应用程序时,登录提示就会停止,并且也会在随机时间停止。

    希望这有帮助!

答案 2 :(得分:3)

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

它通常有一定的意义,但对于已经设置了在每个事务上要求密码的用户(例如某些儿童保护),这非常烦人。因此,与之抗争的唯一方法是在您要求iTunes时明确设置委托。例如,您可以添加一些按钮,例如“恢复我的购买”。不是很漂亮,但绝对不那么讨厌。

答案 3 :(得分:3)

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

答案 4 :(得分:3)

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

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

请勿:

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

<强> DO:

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

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

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

答案 5 :(得分:1)

测试IAP时遇到同样的问题 我测试了3个测试帐户,应用程序会继续询问两个帐户的密码。即使我没有触摸任何购买/恢复按钮或addTransactionObserver 我认为这是因为之前的一些交易没有正确完成, 但是[[SKPaymentQueue defaultQueue] finishTransaction:transaction];根本无法帮助 所以这就是我要解决这个问题的方法:

  1. 输入每个帐户的密码,无论app多少次 商店要求 - 我为3个帐户输入6次 - 直到它从不问 试。
  2. 转到设置并注销苹果ID。
  3. 正常退出应用程序 - 不要在xcode中终止它。然后杀死任务列表中的进程。
  4. 从设备中移除应用程序(只需删除该应用程序无法正常运行,但仍会要求输入密码)
  5. 重启设备
  6. 从XCode /再次运行应用程序,在您的情况下从应用程序商店重新安装应用程序。
  7. 受到Expected sequence when using iTunes test user

    的启发

答案 6 :(得分:1)

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

答案 7 :(得分:1)

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

[GADMobileAds disableAutomatedInAppPurchaseReporting];
-application:didFinishLaunchingWithOptions:

中的

答案 8 :(得分:0)

这似乎是一个无法解决的问题:)我将在Apple支持中提交请求......

答案 9 :(得分:0)

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

您需要在发布到paymentQueue:updatedTransactions:的所有交易上调用finishTransaction,甚至是SKPaymentTransactionStateFailed的交易。

答案 10 :(得分:0)

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

答案 11 :(得分:0)

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

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

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

我离开了:[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; in和应用程序现已获得批准。

答案 12 :(得分:0)

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

答案 13 :(得分:0)

以下是我如何能够始终如一地重现并解决此问题:

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

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

2)恢复购买的交易。

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]

3)立即关闭应用程序。

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

5)启动应用

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

修复:硬重启设备。

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

答案 14 :(得分:0)

您说:

  

但是,对于越来越多的我的用户来说,一旦他们成功完成了应用程序内购买,便会在应用程序每次启动后要求他们提供应用程序商店密码。我相信在以下情况下会发生这种情况:

     

[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

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

  

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

     

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

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