我知道我已经为沙盒环境正确配置了我的应用程序(适用于iOS 7),因为我可以进行测试购买,并且在测试购买时我会看到带有[Environment:Sandbox]文本的警报。收据会同时刷新,我可以使用+ [NSBundle appStoreReceiptURL]方法访问它。
但是每当我尝试单独使用SKReceiptRefreshRequest类中的方法刷新收据时,我只会得到这个序列:
1)“登录”警告显示我从中选择“使用现有Apple ID”。
2)当出现“Apple ID密码”警报时,我输入测试用户的凭据。
3)但输入凭证后,此警报始终显示:
“此Apple ID尚未在iTunes Store中使用。 点按查看即可登录,然后查看您的帐户信息。“
当然会继续询问您在沙箱环境中不应该做的信用卡信息。
我在app delegate中使用此代码来启动收据刷新:
// in didFinishLaunchingWithOptions:
SKReceiptRefreshRequest *request = [[SKReceiptRefreshRequest alloc] initWithReceiptProperties:nil];
request.delegate = self;
[request start];
// with the delegate methods:
-(void)requestDidFinish:(SKRequest *)request
{
if ([request isKindOfClass:[SKReceiptRefreshRequest class]]) {
NSLog(@"Got a new receipt...");
}
}
-(void)request:(SKRequest *)request didFailWithError:(NSError *)error
{
NSLog(@“%@“, error.description);
}
但是调用的唯一委托方法是didFailWithError:它给出了消息:
错误域= SSServerErrorDomain代码= 5001"无法登录" UserInfo = 0x14d8a780 {NSLocalizedFailureReason =此Apple ID尚未在iTunes Store中使用。,NSLocalizedDescription =无法登录}
在尝试刷新收据之前,我总是:
1)从设备中删除应用
2)确保设置 - > App Store没有输入Apple ID凭证
3)使用我的开发者凭据对应用程序进行签名
4)确保测试帐户之前已进行过购买,以便生成收据。
5)确保测试帐户凭据永远不会进入App Store登录(因为这会使其无效以进行测试)。
是否可以在沙箱中进行收据刷新?
更新:正在运行
我终于明白了 - 但我不确切知道关键步骤是什么 - 除了坚持不懈并继续努力。
为了其他有同样问题的人的利益,我遵循的步骤是:
1)创建一个全新的测试用户,但没有在该帐户上进行测试购买。
2)从设备中删除了应用,并确保没有帐户登录到Settings-> App Store。
3)我在Xcode中启动了应用程序并在控制台中收到了我一直在使用的错误消息 - 使用此描述文本:"错误域= SSServerErrorDomain代码= 5001"无法签名在" UserInfo = 0x155f5140 {NSLocalizedFailureReason =此Apple ID尚未在iTunes Store中使用。,NSLocalizedDescription =无法登录}"。
4)当"此Apple ID尚未在iTunes Store中使用时。"警报出现我按了取消按钮。
5)关闭应用程序,不做任何更改,在Xcode下重新启动它。在重新启动之前,我没有从设备中删除该应用程序。
6)这次没有出现“此Apple ID尚未在iTunes Store中使用。”消息,而是出现一个提示输入Apple ID和密码的对话框。我将测试帐户凭据输入对话框。
7)输入测试用户凭据后,调用了SKRequestDelegate requestDidFinish:delegate方法,并将收据放在应用程序包中。顺便提一下,requestDidFinish:方法提供的SKRequest实例的类型为SKReceiptRefreshRequest。
我发现,一旦它第一次工作,它就会继续工作 - 而且我不必删除应用程序或清除来自Settings-> App Store的凭据 - 收据刷新将继续在后台,使用在Settings-> App Store中缓存的测试凭据。