在 iOS 14 中,Xcode 显示警告:
requestReview()' 在 iOS 14.0 中已弃用
我正在使用 StoreKit 在我的应用程序中自动请求审核。
func requestReview() {
guard shouldRequestReview else {return}
SKStoreReviewController.requestReview()
lastRequest = Date()
}
如何消除该警告?
现在有一个新的 RequestReviewAction 可用作环境值:
private struct ContentView: View {
@Environment(\.requestReview) private var requestReview
var body: some View {
Button("Review") {
Task { @MainActor in
requestReview()
}
}
}
}
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)
}
if let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene {
SKStoreReviewController.requestReview(in: scene)
}
适用于 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)
我在 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)
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()
}
}
}
}
由于
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()
}