【问题标题】:'requestReview()' was deprecated in iOS 14.0'requestReview()' 在 iOS 14.0 中已弃用
【发布时间】:2020-09-18 10:22:29
【问题描述】:

在 iOS 14 中,Xcode 显示警告:

requestReview()' 在 iOS 14.0 中已弃用

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

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

如何消除该警告?

【问题讨论】:

    标签: swift storekit ios14


    【解决方案1】:

    快速解决方案

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

    方便的解决方案

    这是一个真正的单线

    SKStoreReviewController.requestReviewInCurrentScene()
    

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

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

    这是一个GitHub repository,带有不同的 Swift 扩展名,包括 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 { $0.activationState == .foregroundActive } as? UIWindowScene
        }
    }
    

    并像这样使用它:

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

    【讨论】:

    • 这不是 iPad IMO 上的理想解决方案。当您打开多个 WindowScene 时,即使窗口在后台,评论弹出窗口也会显示在 first connectedScene 中。
    • @toshi0383 是的,你是对的。当我回答这个问题时,我只考虑了 iOS。请查看多个场景的更新答案。
    • @pawello2222 ,你知道这个问题的答案吗? stackoverflow.com/questions/69272521/…
    • macOS 的等效解决方案是什么?旧功能的优点在于它与操作系统无关。
    【解决方案2】:

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

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

    【讨论】:

    • macOS 的等效解决方案是什么?旧函数的优点在于它与操作系统无关。
    【解决方案3】:

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

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

    【讨论】:

    • 这与前一个答案相同(格式相同)。
    • inexcitus 请更正格式
    猜你喜欢
    • 2021-01-23
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    相关资源
    最近更新 更多