在iOS 14中,Xcode显示了一个警告:

requestReview()在iOS 14.0中被弃用

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

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

enter image description here

如何摆脱这个警告?

推荐答案

快速解决方案

if let scene = UIApplication.shared.connectedScenes.first(where: { $0.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: { $0.activationState == .foregroundActive }) as? UIWindowScene {
            requestReview(in: scene)
        }
    }
}

这是一个GitHub repository,有不同的Swift扩展,包括requestReviewInCurrentScene()


解释

iOS 14中不推荐使用requestReview函数:

@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)

Possible solutions

  • 自定义扩展

您可以创建以下扩展:

extension UIApplication {
    var currentScene: UIWindowScene? {
        connectedScenes
            .first { $0.activationState == .foregroundActive } as? UIWindowScene
    }
}

这样使用:

if let scene = UIApplication.shared.currentScene {
    SKStoreReviewController.requestReview(in: scene)
}
  • 环球one-liner:
if let scene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene {
    SKStoreReviewController.requestReview(in: scene)
}
  • single scene解决方案(适用于iOS)
if let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene {
    SKStoreReviewController.requestReview(in: scene)
}

Swift相关问答推荐

UITableView未显示类数组数据

.onReceive NSWindow.CloseNotify是否会为App中的每个窗口调用?

如何在SWIFT中使用DiscardingTaskGroup获得任务结果

将`@Environment`值赋给`Binding`参数

我可以为UIMenu设定一个固定的订单吗?

如何观察UIViewRepresentable中的多个变化?

列表不显示信息

如何在 macOS/AppKit 的窗口选项卡上接受拖动项目的放置?

如何测试可选 struct 的协议一致性

LeetCode 249. 分组移位字符串

XCUITest 在 TearDown 期间随机失败-无法终止 com.bundle.id

如何更改 Picker 的边框 colored颜色

使 Swift 并发中的任务串行运行

用于 Swift 编码的 iOS 应用程序的 Ffmpeg

关闭 UITableViewRowAction

即使设置为从不也可以访问 iOS11 照片库

在 Swift 中,你可以用另一个字符串分割一个字符串,而不仅仅是一个字符吗?

Swift performSegueWithIdentifier 不起作用

将 UIImage 剪成圆形

Xcode 和 Swift - 没有标题栏但有关闭、最小化和调整大小按钮的窗口