19

从 iOS 10.3 开始,Apple 将审查提示(Rate This App)限制为每年 3 次,并且可以在用户设置中关闭。

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

官方文档这里确实没有太多信息:https ://developer.apple.com/reference/storekit/skstorereviewcontroller

尽管您应该在应用程序的用户体验流程中调用此方法,但评分/评论请求视图的实际显示受 App Store 政策的约束。由于此方法可能会或可能不会显示警报,因此在响应按钮点击或其他用户操作时调用它是不合适的。

4

4 回答 4

13

前言

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

如果此处链接失效,请摘录苹果的回应:

3.2.2 ...您的应用包含可以操纵用户评论或App Store排行榜排名的内容和功能。具体来说,您的应用会过滤用户评论,并仅引导打算给您的应用评分 4 到 5 星的用户在 App Store 上完成评分...

我个人认为,如果您真正尝试解决用户问题,并且仍然让他们有机会在事后发表评论,那么这可能是一种有效的策略,但问题仍然存在,Apple 是否会这样看待它。

可能的解决方案

  1. 显示弹出窗口,询问用户是否喜欢/喜欢/等使用该应用程序。
  2. 尝试使用[SKStoreReviewController requestReview]以获得评论。
  3. 检查窗口的数量是否发生了变化,表明已经显示了一个弹出窗口。这里需要注意的是,这不是 100% 可靠的,因为其他一些事件可能会导致窗口数量发生变化。
  4. 如果窗口数量保持不变,请使用深度链接将用户转发到应用商店。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,所以这只是理论上的。

于 2017-05-23T14:20:02.780 回答
8

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

但是有一种解决方法——其中一个StoreKit类可以混合,以便您可以观察评级对话框何时打开。

UIWindow- 检查周围提到的方法可能也很有用,但是在方法调用上调配可能更可靠。

您还可以使用一些评级管理器,例如AppRating作为 pod 提供的,它可以为您管理内容,但仅在幼稚的水平上通过计算呼叫并记住它。

于 2017-03-16T14:17:45.977 回答
3

我在生产代码中使用此解决方案 - 到目前为止,Apple 没有拒绝:

NSUInteger windowCount = [UIApplication sharedApplication].windows.count;
// SKStoreReviewController only available for >= 10.3, if needed check for class existence
[SKStoreReviewController requestReview];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    BOOL shown = windowCount < [UIApplication sharedApplication].windows.count;
    if (shown) {
        //popup was shown
    }
};
于 2018-11-29T19:10:08.697 回答
2

基于先前“嗅探”窗口计数以进行更改的答案,这里有一个在 iOS 10.3 到 14.4 上的 Swift 5.4 中运行的版本:

func currentWindowCount() -> Int { UIApplication.shared.windows.count }

let initialWindowCount = currentWindowCount()

if #available(iOS 14.0, *) {
    if let scene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene {
        SKStoreReviewController.requestReview(in: scene)
    }
} else {
    SKStoreReviewController.requestReview()
}

DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
    let actuallyShowedPrompt = initialWindowCount < currentWindowCount()
    if actuallyShowedPrompt {
        // do stuff
    }
}
于 2021-03-02T16:58:20.867 回答