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

Dc7*_*Dc7 41 storekit swift ios14

在 iOS 14 中,Xcode 显示警告:

requestReview()' 在 iOS 14.0 中被弃用

我正在使用 StoreKit 在我的应用中自动询问评论。

func requestReview() {
    guard shouldRequestReview else {return}
    SKStoreReviewController.requestReview()
    lastRequest = Date()
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

如何摆脱那个警告?

paw*_*222 82

快速解决方案

if let scene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene {
    SKStoreReviewController.requestReview(in: scene)
}
Run Code Online (Sandbox Code Playgroud)

便捷的解决方案

这是一个真正的单线

SKStoreReviewController.requestReviewInCurrentScene()
Run Code Online (Sandbox Code Playgroud)

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

extension SKStoreReviewController {
    public static func requestReviewInCurrentScene() {
        if let scene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene {
            requestReview(in: scene)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个带有不同 Swift 扩展的GitHub 存储库,包括requestReviewInCurrentScene().


解释

requestReview函数在 iOS 14 中已弃用:

@available(iOS, introduced: 10.3, deprecated: 14.0)
open class func requestReview()
Run Code Online (Sandbox Code Playgroud)

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

@available(iOS 14.0, *)
open class func requestReview(in windowScene: UIWindowScene)
Run Code Online (Sandbox Code Playgroud)

可能的解决方案

  • 自定义扩展

您可以创建以下扩展:

extension UIApplication {
    var currentScene: UIWindowScene? {
        connectedScenes
            .first { $0.activationState == .foregroundActive } as? UIWindowScene
    }
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

if let scene = UIApplication.shared.currentScene {
    SKStoreReviewController.requestReview(in: scene)
}
Run Code Online (Sandbox Code Playgroud)
  • 通用单线
if let scene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene {
    SKStoreReviewController.requestReview(in: scene)
}
Run Code Online (Sandbox Code Playgroud)
  • 单场景解决方案(适用于iOS)
if let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene {
    SKStoreReviewController.requestReview(in: scene)
}
Run Code Online (Sandbox Code Playgroud)

  • @toshi0383 是的,你是对的。当我回答这个问题时,我只想到了 iOS。请参阅多个场景的更新答案。 (3认同)

Ash*_*iya 32

适用于 iOS 13 及更高版本的简单解决方案

斯威夫特 5+

    if #available(iOS 14.0, *) {
        if let scene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene {
            SKStoreReviewController.requestReview(in: scene)
        }
    } else if #available(iOS 10.3, *) {
        SKStoreReviewController.requestReview()
    }
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案 (4认同)