SKStoreReviewController如何检测用户已关闭此应用程序(RTA)设置或3倍限制已达到?

从iOS 10.3开始,Apple将评论提示(评级此应用程序)限制为每年3次,并且可以在用户的​​设置中关闭它。

问:我们如何检测到3次限制已达到或者用户是否关闭了RTA所以在应用程序中我不会显示弹出窗口:“你喜欢这个应用程序吗?如果是的话,你能写评论吗? [是/否]“因为那时,如果用户点击是,则不会显示任何内容。

官方文档中的信息确实不多: https : //developer.apple.com/reference/storekit/skstorereviewcontroller

虽然在应用程序的用户体验流程中有意义时应调用此方法,但评级/审阅请求视图的实际显示由App Store策略控制。 由于此方法可能会或可能不会显示警报,因此响应按钮点击或其他用户操作来调用它是不合适的。

前言

询问用户是否喜欢该应用可能会导致您的应用遭到拒绝。 这是一个例子: https : //twitter.com/pietbrauer/status/791883047373246464

如果链接在此处死亡,则摘录为Apples响应:

3.2.2 …您的应用程序包含可以操纵App Store上的用户评论或图表排名的内容和function。 具体来说,您的应用会过滤用户评论,并且仅指导打算为您的应用评分4到5星的用户在App Store上完成评分…

我个人认为,如果你真的试图解决用户问题,这仍然是一个有效的策略,并且仍然让他们有机会在之后进行审核,但问题仍然是Apple是否会这样看待它。

可能的方案

  1. 显示弹出窗口,询问用户是否喜欢/喜欢/等使用该应用程序。
  2. 尝试使用[SKStoreReviewController requestReview]进行审核。
  3. 检查窗口数是否已更改,表示已显示弹出窗口。 需要注意的是,这不是100%可靠,因为其他一些事件可能导致窗口数量发生变化。
  4. 如果窗口数保持不变,请使用深层链接将用户转发到app store。 SKStoreReviewController的文档建议使用action=write-review作为查询参数直接转到评论页面。

这是一个简单的实现:

 // make sure we the current iOS version supports in app reviews if ([SKStoreReviewController class]) { NSUInteger windowCount = [UIApplication sharedApplication].windows.count; [SKStoreReviewController requestReview]; // give the review controller some time to display the popup dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ if (windowCount < [UIApplication sharedApplication].windows.count) { // assume review popup showed instead of some other system alert // for example show "thank you" } else { // open app store to leave review NSURL *reviewUrl = [NSURL URLWithString:@"{your-app-url}?action=write-review"]; [[UIApplication sharedApplication] openURL:reviewUrl]; } }); } 

注意:我还没有将此代码提交到App Store,所以这只是理论上的。

好吧,您可以尝试触发请求并查看,但只要没有回调以及其他官方方式如何检测在您调用请求方法时是否已显示评级警报。

然而,还有一种方法 – 可以调整其中一个StoreKit类,以便在打开Rating对话框时观察。

UIWindow检查周围提到的方式也可能有用,但调用方法调用可能更可靠。

您还可以使用AppRating等评级管理器作为pod,它可以为您管理这些内容,但只能通过计算呼叫并记住它来实现。