为什么Apple AppStore应用内收据在iOS上为空?

时间:2016-03-16 12:42:52

标签: ios in-app-purchase storekit receipt receipt-validation

在应用程序中,我需要实现自动续订订阅购买。 据我了解文档,我应该在应用程序启动时检查AppStore收据,然后使用我的服务器验证该收据。 在我的代码中,我执行以下操作来检索收据:

NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];

有时receipt正在变为零。 例如:

  • 我推出了一款应用并进行了购买。之后,上面的代码返回非空receipt
  • 使用Xcode停止应用程序。
  • 在下一个应用启动时,receipt为零。

我不明白,为什么会这样。 receiptURL指向收到的文件,但[NSData dataWithContentsOfURL:receiptURL]返回nil。

如果我请求收据刷新,则应用程序会显示用于输入Itunes凭据的对话框。这不好,因为此对话框将出现在应用启动时,这是意外行为。

我做错了吗? 或者这可能是特定于沙盒的情况?

2 个答案:

答案 0 :(得分:2)

在生产中,总会有一张收据(即使应用程序是免费的),可以包含您的额外购买,以防您购买了某些东西或从已购买的商品中恢复。
在测试环境中,直到你买了收据为nil的东西,如果你想测试一个接近生产的案例,你应该先尝试恢复(现在你将有一张收据)并做你需要的。

答案 1 :(得分:1)

Here建议您通过调用SKPaymentTransactionStatePurchased来攻击您的付款程序,无论如何。您需要在接受任何收据之前验证服务器上的收据。
您可以找到收据和黑客here的绝佳描述。