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

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

但是,对于越来越多的用户来说,一旦他们完成了成功的应用程序内购买,那么每次应用程序启动后都会被要求提供他们的App Store密码。 我相信这是在呼吁:

[[SKPaymentQueue defaultQueue] addTransactionObserver:observer]; 

我正在按照苹果应用内购买指南中的步骤6启动。

  • 存档指南: https : //web.archive.org/web/20130515222703/https : //developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StoreKitGuide/AddingaStoretoYourApplication/AddingaStoretoYourApplication.html
  • 实际指南: https : //developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/DeliverProduct.html#//apple_ref/doc/uid/TP40008267-CH5-SW4

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

 [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 

当交易完成,我的内容已经成功下载。

2个问题:

  1. 其他人看到了吗?

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

BOUNTY编辑

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

  1. 我怎样才能防止这样的死亡交易(交易没有完成,用户没有networking,同时更改App-ID)?
  2. 你如何修剪SkPaymentQueue

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

 [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 

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

我有同样的问题,在呼叫login提示:

 [[SKPaymentQueue defaultQueue] addTransactionObserver:observer]; 

即使当我不使用我的应用程序(在主屏幕或其他应用程序中),它也会时不时地出现,这真的很烦人。 环顾四周,似乎有这么多build议的答案来解决这个问题,但是我终于find了我所收集到的一个解决scheme。

注意:在步骤1之前,我已经在iTunes Connect中删除了testing沙箱帐户。 我不确定这是否会影响解决scheme。

为了解决这个问题,我这样做了:

  1. 从Xcode运行你的应用程序。
  2. 等待提示出现。 input所需帐户的密码,然后点击确定。
  3. 按设备上的主页button。
  4. 从Xcode杀死应用程序。
  5. 从设备上删除应用程序。
  6. 在“设置”应用程序中注销iTunes和App Store。
  7. closures设备,然后重新打开。
  8. 从App Store购买一些东西。 当它提示您时,使用生产Apple ID帐户login。 (我假设你应该能够在设置应用下使用iTunes和App Store中的生产帐户login,但这是我做到的)。
  9. 返回到Xcode并再次运行您的应用程序。 (这应该是一个新的安装,因为你之前删除了应用程序。)
  10. 等待login提示出现。
  11. 点击取消。 一个对话框显示“需要login,点击继续并login检查下载。[Environment:Sandbox]”应该出现。 这是与以前的主要区别。 当我要求input密码的时候,按下“取消”button时,我从来没有这个对话框出现。
  12. 点按继续。
  13. input该帐户的密码。

而已。 从那时起,每当我运行我的应用程序时,login提示就会停止,并且随机停止。

希望这可以帮助!

我怀疑这是一个正确的行为。 当你设置一个委托SKPaymentQueue时,试着检查是否有一些事务要完成。 可能没有没有完成交易,但检查的事实需要在iTuneslogin。 我认为你无能为力。

它通常有一定的意义,但是对于每个事务都设置了密码的用户(例如一些儿童保护),这是非常烦人的。 所以唯一的方法就是在你要申请iTunes时明确地设置委托。 例如,您可以添加一些button,如“恢复我的购买”。 不是很漂亮,但肯定不那么讨厌。

有一个问题叫“无限循环”。 在汽车可再生能源的早期,这是一个大问题,大约一周之内,服务器没有将续订限制到5.一个获得一个事务并且没有调用finishTransaction的设备将获得交付给该设备一次的事务一个星期,直到特定的testing用户login并调用finishTransaction。 如果你切换到飞机模式,你可以“清除”这些交易一周 – 但他们回来。

不要在这里删除答案。 这是特别的Stackoverflow的问题,误导了我,把我搞砸了好几天。

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

不要:

  • 删除沙盒testing用户。 这使得无法解决问题,您将不得不联系Apple开发人员支持手动解决。
  • 如果您删除了沙箱testing用户,当您随后反复提示以该用户身份login并完成交易时,则不能,因此名称为“ 无尽环路”问题。 您也不能再次添加删除的testing用户; 开发者门户说用户ID已经被使用了。
  • 删除应用程序或重新安装iOS或任何其他这样的废话。 没有效果,没有解决问题,浪费了很多时间。

做:

  • 完成所有交易的通话。
  • 如果由于某种原因而中断,只需完成后续的应用程序运行。 该应用程序将被重复发送支付队列通知,直到你打电话完成:

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

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

testingIAP时我有同样的问题。
我testing了3个testing帐户,该应用程序保持要求两个帐户的密码。 即使我没有触摸任何购买/恢复button或addTransactionObserver。
我想这是因为之前的一些交易没有正确完成,
但是[[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 根本无法帮助。
所以这是我做什么来解决这个问题:

  1. 无论app store询问多less次都input每个帐户的密码 – 我为3个帐户input了6次 – 直到它再也不问了。
  2. 去设置并注销苹果ID。
  3. 通常退出应用程序 – 不要终止在Xcode。 然后杀掉任务列表中的进程。
  4. 从设备中删除应用程序(只需删除应用程序将无法使用它仍然会要求input密码)
  5. 重启设备
  6. 从XCode /再次运行应用程序在你的情况下,从应用程序商店重新安装应用程序。

在使用iTunestesting用户时受到预期顺序的启发

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

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

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

您需要在发布到paymentQueue:updatedTransactions:的所有事务上调用finishTransaction,即使是SKPaymentTransactionStateFailed的事务。

检查以下,因为我有我的viewDidLoad方法。 我有一个应用程序被拒绝,当苹果要我从非消费品到消费品,但我在我的viewDidLoad方法中留下了以下行:(我认为密码提示是一个问题,从testing用户交换到普通用户回到testing用户)

 [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 

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

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

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

以下是我可以如何持续复制和解决此问题的方法:

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

1)使用testing(沙箱)苹果帐户。

2)恢复购买的交易。

 [[SKPaymentQueue defaultQueue] restoreCompletedTransactions] 

3)立即closures应用程序。

4)退出testing账户(通过设置)

5)启动应用程序

现在,每次启动应用程序时,都会popup“login”表单。 如果我input密码没有关系。 如果我进行购买或恢复购买,这并不重要。 删除并重新安装应用程序并不重要。 每次启动应用程序时,都会显示iTunelogin。

修复:硬重启设备。

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

如果有人看到这一点,并使用GoogleMobileAds.framework,那么你可能还需要打电话

 [GADMobileAds disableAutomatedInAppPurchaseReporting]; 

在应用程序中-application:didFinishLaunchingWithOptions:

Interesting Posts