Is it possible determine if SKStore​Review​Controller has been presented.

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.

After reading Apple’s lacking documentation on SKStore​Review​Controller ( it seems that there is no way to determine if SKStore​Review​Controller is currently presented or has been presented previously.

  • Can't endBackgroundTask: no background task exists with identifier 4, or it may have already been ended
  • UITableView insertRowsAtIndexPaths:WithRowAnimation without freeze UI
  • Core Data Boolean property NSNumber doesn't remember it's boolean
  • iOS 7 alternative to CTCall?
  • Firebase 3x method not working in real device but working on simulator Swift 3.0
  • Programmatically detect if app is being run on device or simulator
  • I understand that I could potentially store the display frequency in NSUserDefaults, but I would prefer to avoid doing so.

    2 Solutions Collect From Internet About “Is it possible determine if SKStore​Review​Controller has been presented.”

    Here is how I detect if it has been presented.

    private static func checkIfShownSKStoreReviewController(_ iteration: Int, originalWindowCount: Int) {
        let 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
        if iteration > 2000 {
            print("checkIfShownSKStoreReviewController: timeout, bailing \(iteration)")
        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, *) {
            checkIfShownSKStoreReviewController(0, originalWindowCount:

    Actually It depends on the Hierarchy you have. If you are using one navigationController

    for (vc in self.navigationController.viewControllers) {
    if (vc isKindOfClass(SKStore​Review​Controller)){
    //Means it is present