'requestReview()' was deprecated in iOS 14.0

SwiftStorekitIos14

Swift Problem Overview


In iOS 14, Xcode is showing a warning:

> requestReview()' was deprecated in iOS 14.0

I'm using StoreKit to ask review automatically in my app.

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

enter image description here

How to get rid of that warning?

Swift Solutions


Solution 1 - Swift

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

Here's a true one-liner:

SKStoreReviewController.requestReviewInCurrentScene()

but first you need to create the following extension in SKStoreReviewController:

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

Here is a GitHub repository with different Swift extensions including requestReviewInCurrentScene().


Explanation

The requestReview function was deprecated in iOS 14:

@available(iOS, introduced: 10.3, deprecated: 14.0)
open class func requestReview()

You need to use the requestReview(in:) function instead:

@available(iOS 14.0, *)
open class func requestReview(in windowScene: UIWindowScene)

Possible solutions

  • Custom extension

You can create the following extension:

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

and use it like this:

if let scene = UIApplication.shared.currentScene {
    SKStoreReviewController.requestReview(in: scene)
}
  • Universal one-liner:
if let scene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene {
    SKStoreReviewController.requestReview(in: scene)
}
  • single scene solution (for iOS)
if let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene {
    SKStoreReviewController.requestReview(in: scene)
}

Solution 2 - Swift

Simply solution for iOS 13 and above

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

Solution 3 - Swift

As SKStoreReviewController.requestReview is deprecated in ios14 You can use SKStoreReviewController.requestReview(in: scene) from ios14
Sample code is below

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDc7View Question on Stackoverflow
Solution 1 - Swiftpawello2222View Answer on Stackoverflow
Solution 2 - SwiftAshvin AView Answer on Stackoverflow
Solution 3 - SwiftJagveer SinghView Answer on Stackoverflow