刷新iOS应用收据:如何确定用户是否需要登录应用商店?

Jas*_*son 24 iphone app-store storekit ios apple-id

我正在iOS 7上实施Apple的"Grand统一收据",允许该应用程序在本地检查应用程序的购买收据,而无需联系Apple的服务器进行验证和验证.如果用户在应用程序中存储了收据,则此方法很有用.如果应用程序缺少收据,最佳做法是请求应用程序刷新收据,如下:

    SKReceiptRefreshRequest *request = [[SKReceiptRefreshRequest alloc] init];
    [request setDelegate:self];
    [request start];
Run Code Online (Sandbox Code Playgroud)

问题是调用此代码将要求用户使用他或她的Apple ID登录.如果这种情况一直发生,或者只有当用户的应用程序商店登录超时时,我并不是100%确定.除非确实有必要,否则我不想向用户显示Apple ID登录屏幕 - 我不希望人们担心他们会被错误地收费.我想显示一个显示屏,告诉用户为什么会要求他们提供Apple ID密码,但前提是他们确实需要输入密码.如果他们不需要输入密码,我希望它是一个无缝且隐藏的过程.什么是最好的方法?我认为最好的方法是检查用户是否需要登录应用程序商店,但我不确定这是否可行.

And*_*nez 16

处理这个问题非常复杂,所以这个答案可能并不完全令人满意(而且我迟到了 - 我知道这一点),但是,希望这对你解决这个特殊问题有所帮助.

有可能我也没有做到这一点,但到目前为止一切正常并且对我有意义,但是如果我在这里说"BS",请随时纠正我.

但无论如何,您无法真正阻止身份验证警报显示,但有几种方法可以最大限度地减少显示的次数.

您无需重新下载您知道不存在的收据.如果用户未购买或未恢复收据,则可以避免尝试重新下载收据并完全避开警报视图.这是我做过的事情:

if([[NSFileManager defaultManager] fileExistsAtPath:[[[NSBundle mainBundle] appStoreReceiptURL] path]] != YES)
{
    SKReceiptRefreshRequest *refresh = [[SKReceiptRefreshRequest alloc] initWithReceiptProperties:nil];
    [refresh start];
}
Run Code Online (Sandbox Code Playgroud)

我把它放在我的main.m文件中,在主应用程序循环之前,因为我的应用程序有很多"专业"功能可以通过IAP解锁,但你可以把它放在你发现它相关的地方.

主要想法是收据是存储在应用程序目录中的实际文件.所以我们在这里所做的一切就是检查收据是否确实存在.如果没有,我们省去了重新刷新它的麻烦,因此省去了向用户显示验证屏幕的麻烦.

如果需要,您可以将此代码放在用户可能使用应用程序"专业"功能的任何位置.SKReceiptRefreshRequest继承SKRequest并因此会调用SKRequestDelegate方法.因此,当用户导航到具有专业功能的屏幕时,您可以刷新收据,然后在调用委托方法时(以及在执行检查收据内容的额外工作之后)启用该功能.

这种方法的一大缺点是它确实需要互联网连接.如果您的应用程序脱机工作,用户将期望其所有IAP也脱机工作,因此在某些情况下重新下载收据将是一个问题.

  • 关于这个主题的Apple文档是如此糟糕(就像他们所做的所有文档,做过和将要做的 - 我提到我讨厌他们的文档吗?)这里没有人有争论,看看你是错还是正确希望你的解决方案似乎有效.谢谢! (10认同)
  • @SpaceDog除了收据问题,我全心全意地反对你.我认为他们的文档是非常宝贵的资源. (4认同)

nev*_*ing 7

在App Store应用程序中,收据通常存在.它与App一起从App Store下载.如果用户使用iTunes将您的应用程序加载到他们的设备上(即从备份中),则不会有收据.

收据不存在的主要用例是您在Xcode中进行调试并且没有做任何事情导致收据被下载(比如刷新收据或购买东西).

在生产中,您只能在一些用户操作后获得新的(新的)收据(他们购买东西,刷新收据并登录,他们恢复购买并登录).无法以静默方式刷新收据.

如果您想在没有用户操作的情况下获得新收据,则必须转到服务器路由.通过您的服务器将旧收据发送到iTunes,获取最新收据.


No *_*ame 5

我想分享我的经验。我一直在沙盒中工作,删除应用后缺少应​​用收据。(然后重新Command-R-ing)我不知道这是否在生产中发生,但听起来好像确实如此。在首次启动应用程序时要求刷新,并提示用户输入密码令人震惊。当然,这是一个问题。

似乎[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]也无提示地刷新了应用程序收据,而没有弹出对话框。意思是,在恢复事务之后,询问appReceiptURL + Data返回非零值。这只是我的少量测试。请自己做测试。

  • 刚尝试过它,并弹出itunes登录提示:(因此,至少在iOS 12中,它不再保持静音... (2认同)