ScreenShipper
Blog
Growth & Marketing

iOS In-App Review Prompt: When and How to Ask for Ratings

How the iOS in-app review prompt works: StoreKit's requestReview APIs, the three-per-year display limit, testing quirks and the best moments to ask.

ScreenShipper team · · 8 min read

Quick answer: On iOS you ask for ratings with Apple's system prompt, called through StoreKit: the SwiftUI requestReview environment action or AppStore.requestReview(in:) in UIKit. Your app only requests it; the system decides whether it appears and shows it at most three times in 365 days per person. Ask right after a successful moment, never at launch or from a button tap.

How the iOS review prompt works

The prompt is a standard system alert. People tap one to five stars and can write an optional review without leaving your app. You can't change its design, and you get nothing back: the call doesn't tell you whether the alert appeared or which rating someone gave.

Apple's StoreKit documentation spells out the display rules:

  • If the person hasn't rated or reviewed your app on that device, StoreKit shows the prompt a maximum of three times within a 365-day period.
  • If they have already rated or reviewed it, the prompt can return only for a new app version and only when more than 365 days have passed since their previous review.
  • People can switch off rating requests for every app in their App Store settings, in which case your call silently does nothing.

Because of these rules, calling the API is a request, not a command. That is why your own timing logic matters more than the API call itself.

There is also a policy side. App Store Review Guideline 5.6.1 tells developers to use the provided API to prompt for reviews and says Apple will disallow custom review prompts. A homemade star screen that imitates the system alert is a rejection risk.

Which StoreKit API to use

Apple has replaced the original SKStoreReviewController methods with newer StoreKit APIs. Here is how they line up today:

APIUse it fromAvailable sinceStatus
RequestReviewAction via @Environment(\.requestReview)SwiftUIiOS 16, macOS 13, visionOS 1Current, recommended
AppStore.requestReview(in:) with a UIWindowSceneUIKitiOS 16Current
SKStoreReviewController.requestReview(in:)UIKitiOS 14Deprecated in the iOS 18 SDK
SKStoreReviewController.requestReview()UIKitiOS 10.3Deprecated since iOS 14

If your deployment target is iOS 16 or later, use the SwiftUI action or AppStore.requestReview(in:). If you still support iOS 15, keep the deprecated scene-based call behind an availability check.

The SwiftUI version in four steps

  1. Add import StoreKit to the view that will ask.
  2. Declare @Environment(\.requestReview) private var requestReview in that view.
  3. When your own conditions are met, call requestReview() on the main actor.
  4. Record that you asked (for example, the current bundle version) so you never ask twice for the same version.

In UIKit, get the active UIWindowScene from your view's window and pass it to AppStore.requestReview(in:). Everything else stays the same.

Gate the call with your own logic

Apple's sample project shows a sensible pattern. It only asks when three conditions are true: the app hasn't prompted for the current bundle version, the person has completed the core task at least four times, and they have paused on the success screen for a few seconds. Apple notes the number four is arbitrary; pick a threshold that matches how often people complete your main task. The sample stores its counters with @AppStorage, and UserDefaults works just as well in UIKit.

When to ask for ratings (and when not to)

Apple's Human Interface Guidelines say to ask only after people have demonstrated engagement, to avoid first launch and onboarding, to avoid interrupting a task, and to consider waiting at least a week or two between requests. The StoreKit sample adds two more rules: don't ask immediately at launch, and don't ask as the result of a user action.

In practice, the best moment is the second after something went right:

App typeGood moment to askMoment to avoid
FitnessAfter a finished workout summaryMid-workout or on the start screen
ProductivityAfter exporting or completing a projectWhile typing or right after an error
GamesAfter winning a level or beating a personal bestAfter losing, or during play
Photo and videoAfter saving or sharing an editWhile an export is still processing
Finance and budgetingAfter reaching a savings goalOn a screen showing an overdue bill
Language learningAfter a streak milestoneIn the middle of a lesson

A few extra guardrails keep you out of trouble:

  • Never ask right after a crash, failed purchase, sync error or paywall.
  • Require both time and depth, for example at least three sessions across five days plus one success event.
  • Ask once per version at most, and skip versions that only fix bugs people complained about.
  • Don't put a "Do you like the app?" screen in front of the system prompt to filter out unhappy users. Apple disallows custom review prompts, and Google's in-app review rules forbid this kind of pre-question outright. Offer a permanent "Send feedback" option instead.

How to test the review prompt

The prompt behaves differently depending on how the app was installed, which confuses many teams during QA:

EnvironmentWhat happens when you request a review
Debug build run from XcodeThe prompt always appears, so you can test the UI and timing
TestFlight buildThe request has no effect and nothing appears
App Store releaseThe system applies its limits and may show nothing

Since TestFlight shows nothing, test your gating logic separately. Log each condition (session count, last prompted version, success events) and write unit tests for the function that decides whether to ask. Then confirm the actual alert in a debug build. For more on beta builds, see the TestFlight guide.

Turn ratings into downloads

Your summary rating appears in search results and on your product page, and it's calculated separately for each country or region. If an old version earned poor ratings, Apple lets you reset the summary rating when you release a new version, though it recommends doing so sparingly. The details are in how App Store ratings work.

Ratings also feed your creative. A strong average or a real, current review quote can become a social-proof screenshot; see social proof in App Store screenshots for the accuracy rules. And when reviews do arrive, answer them: replies are public, and people are notified when you respond. Our guide on how to respond to app reviews has templates.

For the full picture beyond the prompt, including support funnels and what the rules forbid, read how to get more app reviews. If you also ship on Android, the Google Play In-App Review API works on a similar idea but with an undisclosed quota.

Frequently Asked Questions

How many times can I show the App Store review prompt?

You can call the API as often as you like, but the system shows the prompt at most three times within a 365-day period for someone who hasn't rated your app on that device. Build your own logic so you ask at most once per version.

Why isn't my review prompt showing up?

The most common reasons are a TestFlight build (where the call does nothing), the yearly limit already being reached, the person having already rated the app, or the person having turned off in-app rating requests in their settings. The API gives no error in any of these cases.

Can I reward users for leaving a rating?

No. Guideline 3.2.2 says apps must not force people to rate or review to access features or content, and Guideline 5.6.3 treats manipulating reviews as discovery fraud. Rewarding ratings puts your developer account at risk.

Can I find out what rating a user gave in the prompt?

No. StoreKit handles the whole process and returns no result to your app. You'll see the ratings later in App Store Connect, aggregated per country or region, along with any written reviews.

Does the review prompt work on iPad, Mac and Vision Pro?

Yes. RequestReviewAction is available on iOS and iPadOS 16, Mac Catalyst 16, macOS 13 and visionOS 1 or later, so one SwiftUI implementation covers all of them.

Sources

Localize your screenshots in 50 languages

Add languages to one design, translate with AI on Pro and get warnings when a headline overflows.

All guides