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

时间:2017-03-01 13:49:58

标签: ios ios10.3 skstorereviewcontroller

启动iOS 10.3时,Apple会将评论提示(评级此应用程序)限制为每年3次,并且可以在用户设置中将其关闭。

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

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

  

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

4 个答案:

答案 0 :(得分:9)

序言

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

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

  

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

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

可能的解决方案

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

    // 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,所以这只是理论上的。

答案 1 :(得分:6)

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

a way around however - 其中一个StoreKit类可以调整,以便您可以在评级对话框打开时观察。

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

你也可以使用像AppRating这样的评级管理器作为pod,它可以为你管理这些内容,但只能通过计算呼叫并记住它来实现这一目标。

答案 2 :(得分:1)

基于之前对“嗅探”窗口计数的变化做出的回答,这里有一个适用于 Swift 5.4、iOS 10.3 到 14.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
    }
}

答案 3 :(得分:0)

在苹果官方示例中:

https://developer.apple.com/documentation/storekit/skstorereviewcontroller/requesting_app_store_reviews?language=objc

他们正在这样做:

let twoSecondsFromNow = DispatchTime.now() + 2.0
DispatchQueue.main.asyncAfter(deadline: twoSecondsFromNow) { [navigationController] in
    if navigationController?.topViewController is ProcessCompletedViewController {
        SKStoreReviewController.requestReview()
        UserDefaults.standard.set(currentVersion, forKey: UserDefaultsKeys.lastVersionPromptedForReviewKey)
    }
}

我不知道为什么他们不能简单地从SKStoreReviewController.requestReview()返回BOOL。