检测用户取消SKReceiptRefreshRequest以登录

Chr*_*nce 13 in-app-purchase receipt ios7

当我们需要刷新iOS7收据时,适当的方法是使用SKReceiptRefreshRequest.这会打开一个Apple对话框,供用户使用他们的Apple ID登录.它还允许他们取消.我们如何检测用户是否按下取消?(当然,在iOS6中,这可以通过捕获[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]的取消事件来完成).

SKReceiptRefreshRequest对象有一个委托,有两个方法:

- (void)requestDidFinish:(SKRequest *)request;
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error;
Run Code Online (Sandbox Code Playgroud)

在我的代码中,如果用户执行或不按取消,则调用requestDidFinish委托方法.

这对我来说很重要的原因是,如果用户按下取消,我想取消恢复过程.如果刷新请求后根本没有收据,这可能相对容易.但是,有时在SKReceiptRefreshRequest之前应用程序中存在收据(有一些购买),因此如果用户从登录对话框取消,它将保留在应用程序中.

我有两个如何做到这一点的想法:

1)在刷新请求之前删除捆绑中的收据.显而易见的问题是应用程序无法从捆绑包中删除文件(例如,请参阅安装后从捆绑包中删除文件).我试过了.不.

2)在刷新请求之前和之后检查收据的字节; 如果它们不同,那么这应该表明用户没有按下取消.如果他们没有区别,我不确定是否表示他们按下取消.如果收据包含购买,我认为字节会有所不同,因为刷新的收据应该具有不同的交易ID(但是相同的"原始"交易ID).如果收据中没有购买,我不确定.

更新,11/9/15; 我刚刚注意到代表对用户按下取消的响应似乎已经改变.现在,调用didFailWithError.然而,检测用户取消的问题仍然存在.我们如何区分用户按取消和真正的错误?我一直在测试iOS8.4和iOS9.2(测试版).我现在已经向Apple报告了这种缺乏可区分性的错误(bug#23476210).

更新,2015年10月11日; iOS 9.0.2 不会出现此问题!我现在尝试使用所有三个系统,使用相同的应用程序二进制文件,在相同的时间间隔内(所有三个系统在20分钟内):(A)iOS9.2(13C5050d):问题确实发生(调用didFailWithError)并且无法区分真正的错误和用户按下取消),(B)iOS9.0.2,没有发生问题(requestDidFinish被调用),而(C)iOS8.4.1,问题确实发生.对于所有三个系统版本,这是在真实硬件上运行,而不是在模拟器上运行.

ser*_*e-k 2

iOS 9.2.1、Xcode 7.2.1、启用 ARC

我知道您在两年前问过这个问题,但我最近遇到了这个问题并找到了解决方案,并想在这里分享,以便其他人可以节省一些时间。

1) 您可以选择将收据存储到钥匙串中并访问其副本,这允许您根据需要删除或刷新它。

2)是的,你绝对可以检查它是否改变,我认为最简单的方法是使用:

[receipt isEqualToData:(NSData *)(copyReceiptObject)]
Run Code Online (Sandbox Code Playgroud)

我的建议如下:

关键是期望error从该方法中得到的结果:

- (void)request:(SKRequest *)request didFailWithError:(NSError *)error;

当用户在登录对话框出现登录 iTunes Store 后点击“取消”时,会调用该函数。有许多自定义是您可以执行刷新请求,因此结果可能会有所不同,但这是您针对我的请求收到的不同错误:

当没有连接到 iTunes 时:

错误域=SSErrorDomain代码=110 “无法连接到iTunes Store”UserInfo={NSLocalizedDescription=无法连接到iTunes Store, NSUnderlyingError=0x13c76d680 {错误域= NSURLErrorDomain代码=-1009 “无法连接到iTunes Store”UserInfo={NSLocalizedDescription=无法连接到 iTunes Store,NSErrorFailingURLStringKey=

{此处为您的产品 ID 和相应的 URI }

, _kCFStreamErrorCodeKey=8, _kCFStreamErrorDomainKey=12, NSLocalizedDescription=互联网连接似乎已离线。}}}

当用户点击取消时:

错误域=SSErrorDomain代码=16 “无法连接到iTunes Store”UserInfo={NSLocalizedDescription=无法连接到iTunes Store, NSUnderlyingError=0x13c6ac7b0 {错误域=AKAuthenticationError代码=-7003 “(null)”}}

我认为最简单的是检查error.code,如果您想变得更复杂,您可以选择解析完整的错误字符串以获取有关错误的更多详细信息。

就我而言,无连接错误代码是 110,当用户取消登录时错误代码是 16。处理错误。


归档时间:

查看次数:

2687 次

最近记录:

10 年,6 月 前