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

SKReceiptRefreshRequest not working the second time it is called after a cancel

我的应用启动并检查收据。因为是sandbox,所以app从Xcode开始第一次运行,需要去App Store索取receipt。所以我用SKReceiptRefreshRequest来请求它。

弹出 window,要求提供 App Store 凭据。如果我输入凭据,应用会加载收据,我会对其进行验证,然后应用会正常运行。

如果我取消该凭据,问题就会出现 window。

然后我遇到了第一个问题。此时应用程序没有收据,所以我无法验证副本是否是盗版。该怎么办?我尝试了以下方法:当用户尝试使用该应用程序时,我没有禁用该应用程序,而是显示 window 说“无法验证该应用程序,现在输入 OK 进行验证”。

当用户键入 OK 时,我第二次触发 SKReceiptRefreshRequest。再次弹出凭据 window,我输入有效凭据但没有任何反应。 2 或 3 分钟后,windows 弹出“无法连接到 App Store”。

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

收据检索代码为传统代码,即

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");
  }
}

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

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

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