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

刷新iOS应用程序收据:如何确定用户是否需要登录应用程序商店?,ios,iphone,app-store,storekit,apple-id,Ios,Iphone,App Store,Storekit,Apple Id,我在iOS 7上实现了苹果的“大统一收据”,它允许应用程序在本地检查应用程序的购买收据,而无需联系苹果的服务器进行验证。如果用户在应用程序中存储了收据,这将非常有效。如果应用程序缺少收据,最佳做法是请求应用程序刷新其收据,如下所示: SKReceiptRefreshRequest *request = [[SKReceiptRefreshRequest alloc] init]; [request setDelegate:self]; [request start];

我在iOS 7上实现了苹果的“大统一收据”,它允许应用程序在本地检查应用程序的购买收据,而无需联系苹果的服务器进行验证。如果用户在应用程序中存储了收据,这将非常有效。如果应用程序缺少收据,最佳做法是请求应用程序刷新其收据,如下所示:

    SKReceiptRefreshRequest *request = [[SKReceiptRefreshRequest alloc] init];
    [request setDelegate:self];
    [request start];

问题是,调用此代码将要求用户使用其Apple ID登录。我不能100%确定这种情况是否一直发生,或者仅当用户的app store登录超时时才发生。我不想向用户显示Apple ID登录屏幕,除非真的有必要——我不想让人们担心他们会被错误地收取费用。我想显示一个显示屏,告诉用户为什么会要求他们输入Apple ID密码,但前提是他们实际上需要输入密码。如果他们不需要输入密码,我希望这是一个无缝和隐藏的过程。最好的方法是什么?我认为最好的方法是检查用户是否需要登录app store,但我不确定这是否可行。

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

我也有可能做得不对,但到目前为止,一切都正常,对我来说都有意义,但如果我在这里说的是“废话”,请随时纠正我

但无论如何,您无法真正阻止身份验证警报显示,但有几种方法可以将其显示的次数降至最低

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

if([[NSFileManager defaultManager] fileExistsAtPath:[[[NSBundle mainBundle] appStoreReceiptURL] path]] != YES)
{
    SKReceiptRefreshRequest *refresh = [[SKReceiptRefreshRequest alloc] initWithReceiptProperties:nil];
    [refresh start];
}
在主应用程序循环之前,我把它放在我的main.m文件中,因为我的应用程序有很多“pro”功能,可以通过IAP解锁,但是你可以把它放在你认为相关的地方

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

如果您愿意,您可以将此代码放在用户可能使用应用程序“pro”功能的任何位置
SKReceiptRefreshRequest
继承自
SKRequest
,因此它将调用
SKRequestDelegate
方法。因此,当用户导航到带有pro功能的屏幕时,您可以刷新收据,然后在调用委托方法时(以及在完成检查收据内容的额外工作后)启用该功能


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

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


似乎
[[SKPaymentQueue defaultQueue]restoreCompletedTransactions]
也会在不弹出对话框的情况下静默刷新应用程序收据。这意味着,在事务恢复后,请求appReceiptURL+数据将返回一个非零值。这只是我的少量测试结果。请自行测试。

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

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

在生产环境中,您只能在用户执行某些操作后(他们购买物品,您刷新收据并登录,他们恢复购买并登录)才能获得新的(新的)收据。无法静默刷新收据


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

苹果关于该主题的文档非常糟糕(就像他们做的、做过的和将要做的所有文档一样——我提到我讨厌他们的文档了吗?),这里没有人会争论你是对是错@SpaceDog,除了收据问题,我完全不同意你的观点。我认为他们的文档是一个无价的资源。苹果公司声明安装后收据确实存在!他们建议使用“还原”按钮,以便用户只有在确定收据已过期时才刷新收据。自从我两年前写下此答案以来,情况可能发生了变化。@AndyIbanez您的意思是检查路径是否为!=对如果商店收据已经存在,你正在刷新…只要尝试一下,就会弹出一个itunes登录提示:(所以至少在iOS 12中,它不再沉默了。。。