Можно ли определить, был ли представлен SKStore Review Controller?

Я намерен либо отобразить контроллер просмотра SKStore (если применимо), либо отобразить свой собственный контроллер обратной связи и перенаправить пользователя в App Store. Делая это, я могу избежать запроса пользователя для обратной связи более одного раза.

После прочтения отсутствующей документации Apple по контроллеру обзора SKStore ( https://developer.apple.com/reference/storekit/skstorereviewcontroller) кажется, что нет способа определить, представлен ли в настоящее время контроллер обзора SKStore или был представлен ранее.

Я понимаю, что потенциально могу хранить частоту отображения в NSUserDefaults, но я бы предпочел не делать этого.

2 ответа

Вот как я могу определить, был ли он представлен.

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)
    }
}

На самом деле это зависит от вашей иерархии. Если вы используете один навигационный контроллер

for (vc in self.navigationController.viewControllers) {
if (vc isKindOfClass(SKStore​Review​Controller)){

//Means it is present 
  }
}
Другие вопросы по тегам