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

28

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

SKReceiptRefreshRequest *request = [[SKReceiptRefreshRequest alloc] init];
[request setDelegate:self];
[request start];
问题在于调用这段代码会要求用户使用他或她的苹果ID登录。我不确定是否总是发生这种情况,或者只有在用户的应用商店登录已超时时才会发生。除非确实需要,否则我不想向用户显示苹果ID登录屏幕——我不希望人们担心他们会被错误收费。我想要展示一个提示窗口,告诉用户为什么需要他们的苹果ID密码,但只有在他们确实需要输入密码时才这样做。如果他们不需要输入密码,我希望这个过程是无缝和隐藏的。如何最好地继续?我认为最好的方法是检查用户是否需要登录应用商店,但我不确定是否可能。
3个回答

19

这个问题很复杂,所以这个答案可能不完全令人满意(我晚了——我知道),但是希望这能在特定的问题上对您有所帮助。

也许我也没做对,但到目前为止一切都行得通并且对我来说很有意义,但如果我在这里“说胡话”,请随时指正我。

无论如何,您实际上不能防止身份验证警报弹出,但有几种方法可以最大程度地减少它的显示次数。

如果您知道不存在某个收据,就无需重新下载。如果用户没有购买或还未恢复收据,则可以避免尝试重新下载收据并完全避免提示视图。这是我所做的:

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

在我的主要.m文件中,在主应用程序循环之前,我放置了以下内容,因为我的应用程序具有许多通过IAP解锁的“专业”功能,但您可以将其放置在任何相关的位置。

主要思想是,收据是存储在您的应用程序目录中的实际文件。因此,我们在这里做的一切都是检查收据是否存在。如果不存在,我们就不必刷新它,从而节省向用户显示授权屏幕的麻烦。

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

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


13
苹果公司有关这个主题的文档真的很糟糕(就像他们所做、做过和将来会做的所有文档一样,我提到我讨厌他们的文档了吗?)以至于这里没有人有论据来判断你是对还是错。希望你的解决方案似乎有效。谢谢! - Duck
4
除了收据问题,我完全不同意你的观点。我认为他们的文档是一种非常宝贵的资源。 - the_critic
1
苹果公司表示,安装后收据确实存在!他们建议使用“恢复”按钮,以便用户仅在确定其过时时刷新收据。 - Tertium
1
@AndyIbanez 你的意思是要检查路径是否!= YES吗?如果存储收据已经存在,你正在刷新... - strangetimes
@AndyIbanez 我怎样才能知道用户之前购买了哪个产品?收据在哪里?SKReceiptRefreshRequest 不是收据。 - daniel
显示剩余3条评论

12

在应用商店中的应用通常都有收据。它会随着应用一起从应用商店下载。如果用户通过iTunes将您的应用程序加载到其设备上(例如从备份中恢复),则不会有收据。

当您在Xcode中进行调试且尚未采取任何操作导致下载收据时,最常见的情况是找不到收据。

在生产环境中,只有在某些用户操作后才能获得新的(全新的)收据(比如他们购买某物、您刷新收据并且他们登录、他们恢复购买并且登录)。没有办法默默地刷新收据。

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


如果我们使用新的用户帐户并且没有进行任何购买,应用程序收据URL是否存在? - Zulqarnain Naveed

5

我想分享我的经验。我一直在沙盒中工作,发现删除应用后丢失了应用收据。(然后再重新执行Command+R)我不知道这是否会在生产环境中发生,但听起来好像是可能的。第一次启动应用时要求刷新,并提示用户输入密码,这当然是一个问题。

似乎[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]也会默默地刷新应用程序收据而不弹出对话框。这意味着,在恢复交易之后,请求appReceiptURL +数据将返回非空值。这仅是我的少量测试结果,请自行测试。


2
刚试了一下,弹出了一个iTunes登录提示 :( 所以至少在iOS 12中它不再是静默的了... - Georg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接