Ios7 检测到用户取消SKReceiptRefresh登录请求

Ios7 检测到用户取消SKReceiptRefresh登录请求,ios7,in-app-purchase,receipt,Ios7,In App Purchase,Receipt,当我们需要刷新iOS7收据时,适当的方法是使用SKReceiptRefreshRequest。这将打开一个Apple对话框,用户可以使用其Apple ID登录。它还允许用户取消登录我们如何检测用户是否按下了取消按钮?(当然,在iOS6中,这可以通过使用来完成) SKReceiptRefreshRequest对象有一个具有两种方法的委托: - (void)requestDidFinish:(SKRequest *)request; - (void)request:(SKRequest *)requ

当我们需要刷新iOS7收据时,适当的方法是使用SKReceiptRefreshRequest。这将打开一个Apple对话框,用户可以使用其Apple ID登录。它还允许用户取消登录我们如何检测用户是否按下了取消按钮?(当然,在iOS6中,这可以通过使用来完成)

SKReceiptRefreshRequest对象有一个具有两种方法的委托:

- (void)requestDidFinish:(SKRequest *)request;
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error;
在我的代码中,如果用户按或不按cancel,将调用requestDidFinish委托方法

这对我很重要的原因是,如果用户按cancel,我希望取消还原过程。如果刷新请求后没有收据,这可能相对容易。但是,有时在SKReceiptRefreshRequest之前,应用程序中会出现收据(包含一些购买),因此如果用户取消登录对话框,收据将保留在应用程序中

关于如何做到这一点,我有两个想法:

1) 在刷新请求之前从包中删除收据。明显的问题是,应用程序无法从捆绑包中删除文件(例如,请参阅)。我试过了。没有

2) 在刷新请求之前和之后检查收据的字节;如果它们不同,则表明用户没有按“取消”。如果它们没有差异,我不确定是否表示它们按了取消。如果收据包含购买,我认为字节会有所不同,因为刷新的收据应该有不同的交易id(但相同的“原始”交易id)。如果收据上没有货物,我不确定

更新,2015年11月9日我刚刚注意到,代表对用户按Cancel键的响应似乎发生了变化。现在,didror被调用。然而,检测用户取消的问题仍然存在。我们如何区分用户按“取消”和真正的错误?我一直在测试iOS8.4和iOS9.2(beta版)。我现在已经向苹果公司报告了这种缺乏区分性的缺陷(缺陷23476210)


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

iOS 9.2.1、Xcode 7.2.1、ARC启用

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

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

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

[receipt isEqualToData:(NSData *)(copyReceiptObject)]
我的建议如下:

关键是期望从方法中得到
错误

-(void)请求:(SKRequest*)请求失败错误:(NSError*)错误

当用户在登录对话框出现并登录iTunes商店后点击cancel时,就会调用该函数。有许多自定义was,您可以执行刷新请求,因此结果可能会有所不同,但以下是您在我的请求中得到的不同错误:

未连接到iTunes时:

错误域=SSErrorDomain代码=110“无法连接到iTunes存储” UserInfo={NSLocalizedDescription=无法连接到iTunes商店, NSUnderlyingError=0x13c76d680{Error Domain=NSURlerErrorDomain 代码=-1009“无法连接到iTunes商店” UserInfo={NSLocalizedDescription=无法连接到iTunes商店, NSERRORFAILLINGURLSTRINGKEY=

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

,kCFStreamErrorCodeKey=8,kCFStreamErrorDomainKey=12, NSLocalizedDescription=Internet连接似乎处于脱机状态。}

当用户点击“取消”时:

错误域=s错误域代码=16“无法连接到iTunes存储” UserInfo={NSLocalizedDescription=无法连接到iTunes商店, NSUnderlyingError=0x13c6ac7b0{Error Domain=AKAuthenticationError 代码=-7003(空)}

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


在我的例子中,无连接错误代码为110,当用户取消登录时,错误代码为16。处理错误。

我刚刚测试了上面的数字2)。如果在刷新之前有一张非空收据,其中不包含任何采购,则在刷新之后它将是另一张非空收据。或者至少在我的两次尝试中是这样的。当然,更直接的解决办法是好的。例如,调用delete方法以指示用户按下了Cancel。顺便说一句,在我做的测试中,5515字节和5522字节的回执不同。我想知道更多关于这些错误的信息,并在这里问了一个关于SSErrorDomain的后续问题。我不知道使用这样的错误代码有多可靠,但截至2017年1月,按下“取消”时仍返回错误代码16。根本不可靠,但我不知道还有什么其他方法可以检测到这一点,这是一个理想的检测条件,可以让用户体验更好。感谢您验证它是否仍然有效。