Founding price: $25/month for the first 50 teams

SKStoreReviewController: when and how to ask for reviews

Apple's review prompt is the only way to ask for a rating inside an iOS app, and it comes with rules most developers learn the hard way. Here's how it works, how to call it from any stack, and how to pick the moment so the stars are worth having.

Tuan · 2 min read

What SKStoreReviewController does

SKStoreReviewController shows the system's rating sheet: five stars and an optional written review, without leaving your app. You ask iOS to show it, and iOS decides whether it actually appears.

Recent SDKs move the same feature to newer names. In SwiftUI you read requestReview from the environment and call it. In UIKit you call AppStore.requestReview(in:) with the current window scene. Older code calling SKStoreReviewController.requestReview(in:) still works, but Apple marks it as deprecated, so new code should use the newer calls.

The rules you can't change

  • The prompt appears at most three times per user in a 365-day period
  • You get no callback: you never learn whether it appeared or whether the user rated
  • Users can switch it off for every app in Settings
  • In a development build it always appears, but nothing is submitted
  • In TestFlight it never appears
  • Apple's guidelines say to use this API for review prompts, not your own pop-up asking for stars

How to call it from your stack

Swift and SwiftUI

Import StoreKit, add @Environment(\.requestReview) private var requestReview to your view, and call requestReview() when the moment is right. In UIKit, use AppStore.requestReview(in: windowScene).

React Native and Expo

expo-store-review gives you StoreReview.requestReview() and works in bare React Native too. Check StoreReview.hasAction() first, so you don't call it on a device that can't show it.

Flutter

The in_app_review package wraps both platforms: check isAvailable(), then call requestReview().

Android

Google Play has its own In-App Review API (ReviewManager: requestReviewFlow, then launchReviewFlow). The idea is the same: Google limits how often it shows, and you don't learn the result.

When to ask

Because you only get three tries a year, the moment matters more than the code. Ask when the user has just had a good experience, not at launch and never in the middle of a task.

  • After they finish something meaningful, like a workout, an export or a level
  • After a few sessions, not on the first day
  • Right after you solved their problem in a support chat
  • Never right after an error, a crash or a paywall
  • Never in exchange for a reward; Apple doesn't allow it

The support chat moment

The best reviews I've seen come right after a support conversation. Someone was stuck, a real person helped them, and they're grateful. That's the moment to ask.

Chatslane is built around that. When a chat ends well you send a review request with one click, or let an automation do it. The app then shows Apple's own prompt (or Google Play's on Android), so you stay within the rules. A per-user cooldown, 120 days by default, makes sure nobody is asked too often.

Frequently asked questions

How many times can I show SKStoreReviewController?

iOS shows the prompt at most three times per user in 365 days, no matter how often you call it.

Why doesn't the review prompt show in TestFlight?

Apple disables it in TestFlight on purpose. Test it in a development build, where it always appears but nothing is submitted.

Can I know if the user left a review?

No. Apple and Google don't tell your app whether the prompt appeared or what the user did.

Can I link straight to the review page instead?

Yes, for a button the user taps themselves, like "Rate this app" in settings: link to your App Store page with action=write-review. For asking unprompted, use the system prompt.

Give your users a reason to stay.

One flat monthly price. Live in minutes. Cancel any time.