我的目的是显示SKStore Review Controller(如果适用)或显示我自己的反馈控制器并将用户重定向到App Store。通过这样做,我可以避免多次询问用户反馈。
在阅读了Apple缺乏关于SKStore Review Controller(https://developer.apple.com/reference/storekit/skstorereviewcontroller)的文档之后,似乎无法确定SKStore Review Controller目前是否已呈现或之前是否已呈现。
我知道我可能会将显示频率存储在NSUserDefaults中,但我宁愿避免这样做。
答案 0 :(得分:1)
以下是我如何检测它是否已被呈现。
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)
}
}
答案 1 :(得分:-4)
实际上这取决于你拥有的层次结构。如果您使用的是一个navigationController
for (vc in self.navigationController.viewControllers) {
if (vc isKindOfClass(SKStoreReviewController)){
//Means it is present
}
}