Optimizing Your Application’s Reviews

Published on: October 14, 2019

We all love the idea of getting loads of App Reviews, preferably with five stars and a description that explains why our apps are amazing. Unfortunately, users often don’t take the time to reviews the apps they enjoy. Instead, users will review your app when they’re unhappy. If something about your app doesn’t please them or something doesn’t work as expected, they will happily write an angry review and rate your app one star. So how do we get people to review apps when they are happy so they give us five stars? That’s exactly what I would like to discuss in this blogpost. By the end of this post you will have learned the following:

  • How to use iOS’ built-in review prompt to allow users to rate your app without going to the App Store.
  • Timing your review prompt to avoid frustrating your users.

Let’s dive right in, shall we?

Using iOS’ built-in review prompt

In iOS 10.3 Apple shipped an amazing little feature that might have gone unnoticed for many people. It’s called SKStoreReviewController and Apple describes it as follows:

An object that controls the process of requesting App Store ratings and reviews from users.

Sounds good right? Before I explain how you can use it in your app, let’s see what it does:

In the above screenshot, you can see a neat prompt that asks a user to review the current app. They can immediately tap the number of stars they want to give your app and they can choose to write a review if they please. Because this prompt is so straightforward to use, users are far more likely to rate your app than when you would show them a different kind of alert. For example, the following alert is far less likely to get the same amount of engagement as the SKStoreReviewController version.

Using the SKStoreReviewController is astonishingly straightforward. The following code is all you need to show a rating prompt:


Don’t forget to import StoreKit in the file where you wish to ask for reviews.

When your app is in production and you call requestReview, iOS will not always present a review prompt to the user. For example, if they have already rated your app or choose not to rate your app, iOS might choose to not ask the user again for a while until you have shipped an app update.

Now that you know how to ask for a review, let’s see how you can optimize when to ask your users to review your app.

Improving your review prompt strategy

Some apps are very eager to ask users for reviews and they don’t have a good strategy in place. Or any strategy at all for that matter. When a user has just downloaded your app, it’s not the best time to ask them for reviews. They are exploring your app, trying to figure out what it does and whether it suits their needs. They are still forming an opinion to see if they wish to use your app more often, or maybe look further for a different app that has similar features. Asking for a review at that moment isn’t a great look, your app will come across as a little pushy, inconsiderate and not very optimized for the user. This will be review prompt strategy lesson one:

Lesson one:
Don’t ask users for review during their first time using the app. Wait until the user has used your app a couple of times over a several day period.

Often users will come to your app with a goal. Sometimes the goal is small, like checking the weather and sometimes the goal is more complex, like writing a document or email. Interrupting users to ask them to review your app is unlikely to make your users happy. They might decide to simply close your prompt and get on with their task. If they get interrupted by review prompts too often, they might just rate your app one star, just to get it over with. Instead, try to postpone asking for reviews until your user has achieved their goal. You are far more likely to get a positive response from your users.

Lesson two:
Interrupting users to get them to review your app isn’t great. Try asking for reviews at the end of a task, game or after the user has found the information they were looking for.

Lastly, if a user has just had a negative experience with your app, you might want to hold off asking for a review. Imagine you’ve built a game and the user has failed to complete a level several times. They’ve spent the better part of an hour trying but simply couldn’t succeed. Normally, you might consider a user that returns to the game’s home screen as a user that completed a task and ask them for a review. However, this particular user hasn’t had the best experience today so it’s best to ask them for a review some other time, maybe after they have completed a couple of levels in your game without. Users that just had a positive experience are far more likely to bless your app with a good review than users that are frustrated.

Lesson three:
Asking users for reviews when they just had a less than ideal experience isn’t going to give you the best results. Instead, try to ask for a review after the user has done something positive in your app, like win a game for example.

Knowing these lessons is great, but how can you determine the best time to ask for a review, especially if you don’t want to ask a user for a review on their first launch, or after they have just lost a game. In the next section, I will show you a simple approach that uses the UserDefaults storage to keep track of some statistics.

Implementing your review strategy

Keeping track of what a user has done in your app, and whether it’s a good time to ask for reviews is essential to get right. Luckily, it’s not very complex to store some basic information in UserDefaults. Personally, I like to wrap all logic related to collecting reviews in a ReviewManager object that has access to a UserDefaults store:

struct ReviewManager {
  let userDefaults: UserDefaults

  init(userDefaults: UserDefaults = UserDefaults.standard) {
    self.userDefaults = userDefaults

Some of the basic functionality for this ReviewManager typically is to track the first launch date, the number of total launches and an askForReviewIfNeeded() method:

struct ReviewManager {
  let userDefaults: UserDefaults
  let minimumInstallTime: TimeInterval = 60 * 60 * 24 * 30 // 1 month
  let minimumLaunches = 10

  init(userDefaults: UserDefaults = UserDefaults.standard) {
    self.userDefaults = userDefaults

  func trackLaunch() {
    if userDefaults.double(forKey: "firstLaunch") == 0.0 {
      userDefaults.set(Date().timeIntervalSince1970, forKey: "firstLaunch")

    let numberOfLaunches = userDefaults.integer(forKey: "numberOfLaunches")
    userDefaults.set(numberOfLaunches + 1, forKey: "numerOfLaunches")

  func askForReviewIfNeeded() {
    guard shouldAskForReview()
      else { return }


  private func shouldAskForReview() -> Bool {
    let timeInstalled = Date().timeIntervalSince1970 - userDefaults.double(forKey: "firstLaunch")
    let numberOfLaunches = userDefaults.integer(forKey: "numberOfLaunches")

    guard timeInstalled > minimumInstallTime,
      numberOfLaunches > minimumLaunches
      else { return false }

    return true

Of course, you can expand the logic to determine whether it is appropriate to ask for a review, for instance by tracking the number of games played or won in a game, the number of documents created or other metrics that you think are relevant to your user. Make sure to pass your reviewManager around in your application to the relevant places so they can call askForReviewIfNeeded whenever you think it’s a good moment to do so.


In this post, you have learned about the SKStoreReviewController and how it allows you to prompt users to review your app in a convenient manner. You have also learned several essential rules to ensure you ask for reviews when users are most likely to leave you a positive review. Lastly, you also learned how you can keep track of a user’s behavior in your app by storing values in UserDefaults and using them to determine whether it’s a good time to ask your user for an app review.

As always, feedback, compliments, and questions are welcome. You can find me on Twitter if you want to reach out to me.


App Development

Subscribe to my newsletter