取消后第二次调用 SKReceiptRefreshRequest 时不起作用

Spa*_*Dog 3 iphone app-store storekit ios

我的应用程序启动并检查收据。因为它是沙盒,所以应用程序第一次从 Xcode 运行时,需要向 App Store 索要收据。所以我常常SKReceiptRefreshRequest要求它。

弹出一个窗口,要求提供 App Store 凭据。如果我输入凭据,那么应用程序会加载收据,我会对其进行验证,并且应用程序会正常运行。

如果我取消该凭证窗口,问题就会开始。

然后我遇到了第一个问题。目前该应用程序没有收据,因此我无法验证该副本是否为盗版。该怎么办?我尝试了以下方法:当用户尝试使用该应用程序时,我没有禁用该应用程序,而是显示一个窗口,显示“无法验证该应用程序,请输入“确定”立即验证”。

当用户输入“确定”时,我会SKReceiptRefreshRequest再次触发。再次弹出一个凭据窗口,我输入有效的凭据,但没有任何反应。两三分钟没有任何反应后,会弹出一个窗口,提示“无法连接到 App Store”。

奇怪的是,在此故障期间没有调用任何委托request:didFailWithError:方法requestDidFinish:SKReceiptRefreshRequest收据检索失败,没有触发任何委托方法,是的,委托已分配。

收据检索的代码是传统的,即

SKReceiptRefreshRequest *refreshReceiptRequest = [[SKReceiptRefreshRequest alloc] initWithReceiptProperties:nil];
refreshReceiptRequest.delegate = self;
[refreshReceiptRequest start];

- (void)request:(SKRequest *)request didFailWithError:(NSError *)error {
  NSLog(@"ERROR");
}

- (void)requestDidFinish:(SKRequest *)request {
  if([request isKindOfClass:[SKReceiptRefreshRequest class]])
  {
    NSLog(@"App Receipt exists after refresh");
  } else {
    NSLog(@"Receipt request done but there is no receipt");
  }
}
Run Code Online (Sandbox Code Playgroud)

Spa*_*Dog 6

显然这是一个错误SKReceiptRefreshRequest。如果用户取消第一个凭证框,应用程序将无法第二次检索收据,至少在沙盒模式下是这样。因为这在沙盒模式下不起作用,所以你无法测试,而且当 Apple 审查你的应用程序时这也不起作用,你的应用程序将被拒绝。

此外,从任务栏终止应用程序将无助于使凭据框再次出现。

唯一的解决方案是发出警报,告诉用户从商店中删除并重新下载您的应用程序,并且当应用程序要求提供 Apple ID/密码时不要取消凭据框。

  • 上次我检查时问题仍然存在。苹果很少修复这样的错误。他们利用自己的资源来修复那些给他们带来负面新闻的错误,并最终修复所报告的 1 万亿个错误中的一个或另一个。在意识到我已经填写了大约 250 个错误报告但没有一个得到修复后,我很久以前就不再为他们报告错误了。 (4认同)