是否可以确定 SKStore Review Controller 是否已呈现. [英] Is it possible determine if SKStore​Review​Controller has been presented.

查看:53
本文介绍了是否可以确定 SKStore Review Controller 是否已呈现.的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的意图是要么显示 SKStore Review Controller(如果适用),要么显示我自己的反馈控制器并将用户重定向到 App Store.通过这样做,我可以避免多次询问用户反馈.

My intention is to either display the SKStore​Review​Controller (If applicable) or display my own feedback controller and redirect the user to the App Store. By doing this I can avoid asking the user for feedback more than once.

在阅读 Apple 关于 SKStore Review Controller (https://developer.apple.com/reference/storekit/skstorereviewcontroller) 似乎无法确定 SKStore Review Controller 是当前呈现还是之前已呈现.

After reading Apple's lacking documentation on SKStore​Review​Controller (https://developer.apple.com/reference/storekit/skstorereviewcontroller) it seems that there is no way to determine if SKStore​Review​Controller is currently presented or has been presented previously.

我知道我可以将显示频率存储在 NSUserDefaults 中,但我宁愿避免这样做.

I understand that I could potentially store the display frequency in NSUserDefaults, but I would prefer to avoid doing so.

推荐答案

这是我检测它是否已呈现的方法.

Here is how I detect if it has been presented.

private static func checkIfShownSKStoreReviewController(_ iteration: Int, originalWindowCount: Int) {
    let windows = UIApplication.shared.windows
    if windows.count > originalWindowCount {
        let window = windows[1]

        if window.className == "UITextEffectsWindow" || window.className == "UIRemoteKeyboardWindow" {
            print("Shown SKVC iteration: \(iteration)")

            //Do logic stuff like saving to your database
            return
        }
    }

    if iteration > 2000 {
        print("checkIfShownSKStoreReviewController: timeout, bailing \(iteration)")
        return
    }

    runThisAfterDelay(seconds: 0.02, after: {
        checkIfShownSKStoreReviewController(iteration + 1, originalWindowCount: originalWindowCount)
    })
}

private static func runThisAfterDelay(seconds seconds: Double, after: () -> ()) {
    let time = dispatch_time(DISPATCH_TIME_NOW, Int64(seconds * Double(NSEC_PER_SEC)))
    dispatch_after(time, dispatch_get_main_queue(), after)
}

static func showReview() {
    print("Showing AppStore Review")
    if #available(iOS 10.3, *) {
        SKStoreReviewController.requestReview()
        checkIfShownSKStoreReviewController(0, originalWindowCount: UIApplication.shared.windows.count)
    }
}

这篇关于是否可以确定 SKStore Review Controller 是否已呈现.的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆