'requestReview()' was deprecated in iOS 14.0 - Printable Version +- 0Day Forums (https://0day.red) +-- Forum: Coding (https://0day.red/Forum-Coding) +--- Forum: Swift (https://0day.red/Forum-Swift) +--- Thread: 'requestReview()' was deprecated in iOS 14.0 (/Thread-39-requestReview-39-was-deprecated-in-iOS-14-0) |
'requestReview()' was deprecated in iOS 14.0 - shariaeorvraory - 07-18-2023 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][1]][1] How to get rid of that warning? [1]: RE: 'requestReview()' was deprecated in iOS 14.0 - mentorjivyzzh - 07-18-2023 ## iOS 16+ There is now a new [RequestReviewAction]( [To see links please register here] ) that is available as an environment value:```swift private struct ContentView: View { @Environment(\.requestReview) private var requestReview var body: some View { Button("Review") { DispatchQueue.main.async { requestReview() } } } } ``` ## iOS 14+ ### Quick solution ``` if let scene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene { DispatchQueue.main.async { SKStoreReviewController.requestReview(in: scene) } } ``` *Note: according to some comments it's more reliable with `DispatchQueue.main.async`* ### 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 { DispatchQueue.main.async { requestReview(in: scene) } } } } ``` <sub>Here is a [GitHub repository]( [To see links please register here] ) with different Swift extensions including [`requestReviewInCurrentScene()`]([To see links please register here] ;--- ### 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) } ``` RE: 'requestReview()' was deprecated in iOS 14.0 - photoreduces258267 - 07-18-2023 I made a small wrapper over SKStoreReviewController that saves the headache of supporting different versions of ios. Also it works for 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) [To see links please register here] RE: 'requestReview()' was deprecated in iOS 14.0 - Sirmum3 - 07-18-2023 iOS 16 has a new way to do it: [To see links please register here] In my tests it is crucial to do it on the main queue. Otherwise the dialogue is unreliable. private struct ContentView: View { @Environment(\.requestReview) private var requestReview var body: some View { Button("Ask for Review") { DispatchQueue.main.async { requestReview() } } } } RE: 'requestReview()' was deprecated in iOS 14.0 - weatheredjljumwlk - 07-18-2023 **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) RE: 'requestReview()' was deprecated in iOS 14.0 - billyes - 07-18-2023 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() } |