'requestReview()' 在 iOS 14.0 中被弃用

'requestReview()' was deprecated in iOS 14.0

在 iOS 14 中,Xcode 显示警告:

requestReview()' was deprecated in iOS 14.0

我正在使用 StoreKit 在我的应用程序中自动请求评论。

func requestReview() {
    guard shouldRequestReview else {return}
    SKStoreReviewController.requestReview()
    lastRequest = Date()
}

如何消除该警告?

快速解决

if let scene = UIApplication.shared.connectedScenes.first(where: { [=10=].activationState == .foregroundActive }) as? UIWindowScene {
    SKStoreReviewController.requestReview(in: scene)
}

方便的解决方案

这是一个真实的 one-liner:

SKStoreReviewController.requestReviewInCurrentScene()

但首先您需要在 SKStoreReviewController 中创建以下扩展:

extension SKStoreReviewController {
    public static func requestReviewInCurrentScene() {
        if let scene = UIApplication.shared.connectedScenes.first(where: { [=12=].activationState == .foregroundActive }) as? UIWindowScene {
            requestReview(in: scene)
        }
    }
}

这是一个GitHub repository with different Swift extensions including requestReviewInCurrentScene().


说明

requestReview 函数已在 iOS 14 中弃用:

@available(iOS, introduced: 10.3, deprecated: 14.0)
open class func requestReview()

您需要改用requestReview(in:)函数:

@available(iOS 14.0, *)
open class func requestReview(in windowScene: UIWindowScene)

可能的解决方案

  • 自定义扩展

您可以创建以下扩展:

extension UIApplication {
    var currentScene: UIWindowScene? {
        connectedScenes
            .first { [=15=].activationState == .foregroundActive } as? UIWindowScene
    }
}

并像这样使用它:

if let scene = UIApplication.shared.currentScene {
    SKStoreReviewController.requestReview(in: scene)
}
  • 通用one-liner:
if let scene = UIApplication.shared.connectedScenes.first(where: { [=10=].activationState == .foregroundActive }) as? UIWindowScene {
    SKStoreReviewController.requestReview(in: scene)
}
  • 单场景解决方案(for iOS)
if let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene {
    SKStoreReviewController.requestReview(in: scene)
}

iOS13岁及以上

的简单解决方案

Swift 5+

    if #available(iOS 14.0, *) {
        if let scene = UIApplication.shared.connectedScenes.first(where: { [=10=].activationState == .foregroundActive }) as? UIWindowScene {
            SKStoreReviewController.requestReview(in: scene)
        }
    } else if #available(iOS 10.3, *) {
        SKStoreReviewController.requestReview()
    }

因为 SKStoreReviewController.requestReview 在 ios14 中被弃用 您可以使用 ios14
中的 SKStoreReviewController.requestReview(in: scene) 示例代码如下

if #available(iOS 14.0, *) {
    if let scene = UIApplication.shared.connectedScenes.first(where: { [=10=].activationState == .foregroundActive }) as? UIWindowScene {
        SKStoreReviewController.requestReview(in: scene)
    }
} else if #available(iOS 10.3, *) {
    SKStoreReviewController.requestReview()
}