“requestReview()”在 iOS 14.0 中已弃用

问题描述 投票:0回答:5

在 iOS 14 中,Xcode 显示警告:

requestReview()' 在 iOS 14.0 中已弃用

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

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

如何消除该警告?

swift storekit ios14
5个回答
193
投票

iOS 16+

现在有一个新的 RequestReviewAction 可用作环境值:

private struct ContentView: View {
    @Environment(\.requestReview) private var requestReview

    var body: some View {
        Button("Review") {
            Task { @MainActor in
                requestReview()
            }
        }
    }
}

iOS 14+

快速解决方案

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

注意:根据一些评论,使用

DispatchQueue.main.async

更可靠

便捷的解决方案

这是真正的单行

SKStoreReviewController.requestReviewInCurrentScene()

但首先您需要在

SKStoreReviewController
中创建以下扩展:

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

这里是一个 GitHub 存储库,其中包含不同的 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)
}

61
投票

适用于 iOS(13 及以上)和 macOS 的简单解决方案

iOS(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: 不要忘记将您的 Apple ID 替换为 URL“id123456789”

guard let writeReviewURL = URL(string: "https://itunes.apple.com/app/id123456789?action=write-review") else {
      print("Invalid URL")
      return
}
NSWorkspace.shared.open(writeReviewURL)

3
投票

我在 SKStoreReviewController 上做了一个小包装,这样可以省去支持不同版本 ios 的麻烦。它也适用于 macOS。

// Review after 3 launches
AppReview.requestIf(launches: 3)

// Review after 5 days
AppReview.requestIf(days: 5)

// Review after 3 launches and 5 days
AppReview.requestIf(launches: 3, days: 5)

https://github.com/mezhevikin/AppReview


0
投票

iOS 16 有一种新方法:https://developer.apple.com/documentation/storekit/requestreviewaction

在我的测试中,在主队列上执行此操作至关重要。否则对话不可靠。

private struct ContentView: View {

    @Environment(\.requestReview) private var requestReview

    var body: some View {
        Button("Ask for Review") {
            DispatchQueue.main.async {
                requestReview()
            }
        }
    }
}

-8
投票

由于

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()
}
© www.soinside.com 2019 - 2024. All rights reserved.