是否可以确定SKStore Review Controller是否已经出现。

我的意图是要么显示SKStore审查控制器(如果适用),要么显示我自己的反馈控制器,并将用户redirect到App Store。 通过这样做,我可以避免不止一次询问用户的反馈。

在阅读苹果在SKStore Review Controller( https://developer.apple.com/reference/storekit/skstorereviewcontroller )上缺less的文档之后,似乎没有办法确定SKStore Review Controller目前是否已经呈现或已经呈现先前。

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

这是我如何检测,如果它已经提交。

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