Asking for ratings on iOS: RequestReviewAction and SKStoreReviewController
On iOS you ask for a rating only through Apple's system prompt (RequestReviewAction in SwiftUI, AppStore.requestReview(in:) in UIKit, formerly SKStoreReviewController), which the system shows at most three times per app in 365 days, so call it after a moment of real success and never from a button.
What are the rules for asking for ratings on iOS?
Apple allows exactly one way to ask for a rating inside an app: the system prompt from StoreKit. Guideline 5.6.1 says to use the provided API and that Apple will disallow custom review prompts. You call the API; StoreKit decides whether to show it.
| Rule | Source |
|---|---|
| Use the system prompt, no custom rating pop-ups | App Review Guidelines 5.6.1 |
| Shown at most 3 times per app in 365 days (person who has not rated) | StoreKit documentation |
| Already rated: shown only for a new version and after 365+ days | StoreKit documentation |
| Do not call it from a button tap | StoreKit documentation |
| No effect in TestFlight; always shown in development | StoreKit documentation |
| Do not force a rating to unlock features | App Review Guidelines 3.2.2(x) |
| No paid, incentivized or fake reviews | App Review Guidelines 3.0 and 5.6.3 |
People can also turn off rating prompts for all apps on their device, so even a perfectly timed call can show nothing.
Which API should you use?
| Framework | API | Available from |
|---|---|---|
| SwiftUI | RequestReviewAction via the requestReview environment value | iOS 16 |
| UIKit | AppStore.requestReview(in: UIWindowScene) | iOS 16 |
| UIKit, older targets | SKStoreReviewController.requestReview(in:) | iOS 14, deprecated from iOS 18 |
| Legacy | SKStoreReviewController.requestReview() | Deprecated since iOS 14 |
SwiftUI example
The pattern is three lines inside your view:
import StoreKit@Environment(\.requestReview) private var requestReviewrequestReview()at the moment you chose, for example when a "plan finished" screen appears
A typical place is an .onAppear or a state change on a success screen, guarded by your own counter, for example: only after the third completed workout and not more than once per version.
UIKit example
import StoreKitif let scene = view.window?.windowScene { AppStore.requestReview(in: scene) }
Call it on the main actor, after the success view is on screen, never inside a button's action.
When should you ask?
Apple's Human Interface Guidelines give the timing rules; turn them into a decision path:
- Has the person shown engagement? Completed a level, finished a task, reached a goal. If not, do not ask.
- Is this first launch or onboarding? Do not ask. People have not formed an opinion and may rate low.
- Are they in the middle of something? Do not interrupt; wait for a natural break.
- Did you ask recently? Leave at least a week or two between requests.
- Did something just go wrong (an error, a failed payment, a crash recovery)? Do not ask now.
- All clear: call the API and continue your flow as if nothing happened. You will not know whether the prompt appeared.
How do you test it?
- Development builds: the prompt always appears, so you can check placement and flow.
- TestFlight: the request has no effect. Do not report a bug when testers never see it.
- Production: StoreKit applies its limits; there is no way to force the prompt.
Can you link to the review page instead?
Yes, for a persistent "Rate this app" entry in settings. Apple suggests appending action=write-review to your App Store product URL, which opens the page where people can write a review. Use this for a button; use the system prompt for moments.
Mistakes that break the rules or waste the prompt
- A "Do you like the app?" pre-screen that sends happy users to the prompt and unhappy ones to email. It is a custom review flow and filters feedback, which the guidelines treat as manipulation.
- Rewards for ratings (coins, unlocks, discounts).
- Calling the API on every launch: the limit runs out on bad moments.
- A "Rate us" button wired to the system prompt; it may silently do nothing.
What happens after the rating?
Ratings and written reviews arrive in App Store Connect under Ratings and Reviews, where you can reply. How to answer well is in replying to app reviews, and what to do when ratings fall is in negative reviews and rating drops. The Android counterpart is the Google Play In-App Review API.
To see whether a new prompt placement changes anything, Uptika's Reviews page shows both stores' reviews with the rating distribution and weekly average, filterable by version, and the free One-Star Reasons tool sorts any app's recent 1-2 star reviews by cause. The free plan starts with one app.
Questions
How do I use requestReview in SwiftUI?
Read the requestReview environment value with @Environment(\.requestReview) and call it like a function at the chosen moment. It is available from iOS 16. StoreKit decides whether the prompt actually appears.
How many times can I ask for a rating on iOS?
You can call the API as often as you like, but the system shows the prompt at most three times per app in 365 days for someone who has not rated. If they have rated, it shows again only for a new app version and after more than 365 days since their last review.
When should an app ask for a rating?
After people have shown engagement: a finished level, a completed task, a successful result. Apple's guidelines say to avoid first launch and onboarding, avoid interrupting a task, and leave at least a week or two between requests.
Why doesn't requestReview show in TestFlight?
By design. Apple's documentation says the request has no effect in apps distributed through TestFlight. In development builds the prompt always appears so you can test the flow.
Is SKStoreReviewController deprecated?
Yes. SKStoreReviewController.requestReview() was deprecated in iOS 14 in favour of requestReview(in:), and the SKStoreReviewController class is deprecated from iOS 18 in favour of AppStore.requestReview(in:). In SwiftUI use RequestReviewAction.
Sources
- RequestReviewAction (Apple Developer Documentation)
- requestReview(in:) for UIWindowScene (Apple Developer Documentation)
- SKStoreReviewController requestReview() (Apple Developer Documentation)
- Ratings and reviews (Human Interface Guidelines)
- Ratings, reviews and responses (Apple Developer)
- App Review Guidelines 5.6.1 and 3.2.2 (Apple Developer)