'requestReview()' was deprecated in iOS 14.0
iOS 16+
There is now a new RequestReviewAction that is available as an environment value:
private struct ContentView: View {
@Environment(\.requestReview) private var requestReview
var body: some View {
Button("Review") {
requestReview()
}
}
}
iOS 14+
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)
}
Simple solution for iOS(13 & above) and 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: Don't forget to replace your Apple ID with in 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)