28

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

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

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

4

3 回答 3

19

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

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

但是无论如何,您不能真正阻止身份验证警报的出现,但是有几种方法可以最大限度地减少它的出现次数。

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

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

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

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

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

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

于 2014-01-12T07:00:59.057 回答
12

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

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

在生产中,您只能在某些用户操作后获得新的(新鲜)收据(他们购买了东西,您刷新收据并登录,他们恢复购买并登录)。没有办法静默刷新收据。

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

于 2017-04-19T11:40:21.963 回答
5

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

似乎[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]也默默地刷新了应用程序收据而不弹出对话框。意思是,在事务恢复后,请求 appReceiptURL + Data 返回一个非零值。这只是来自我的少量测试。请做你自己的测试。

于 2015-01-14T21:12:27.190 回答