Skip to Content

Adding SKStoreReviewController to Couchy

Posted on 4 mins read

In September 2016 I released version 1.0 of Couchy. I never added any kind of popup which asks for a rating or review which is probably one of the reasons why I only got about 15 over the course of the first year. Having to leave the app and redirect the user to the iOS App Store for a rating was always a deal breaker for me, even if I miss out on some feedback because of that.

SKStoreReviewController

Fortunately, in iOS 10.3 SKStoreReviewController was introduced. Now developers can display a prompt in their apps where users can leave a rating and an optional written review with just a single tap. And most importantly: The user does not have to leave the app. This sounds pretty incredible, but there are a few points to consider when adding SKStoreReviewController to your app.

  1. Give user enough time to form an opinion.
  2. Find a good moment where it makes sense to display the prompt.
  3. Do not annoy the user asking for a rating again and again. This is especially important because the prompt is limited to three occurrences per app within a 365-day period.

You can read more about that in the iOS Human Interface Guidelines.

Asking for a review in Couchy

In the following I want to go into detail how I used SKStoreReviewController in Couchy. The first important point to consider was to give the user enough time to form an opinion. For me it was important that the app was used at least for a week before showing the prompt for the first time. To accomplish this, I simply stored the date when the app was first launched in the UserDefaults.

UserDefaults.standard.set(Date(), forKey: "firstLaunchDate")

When to show the prompt is the second import point we have to consider. In general this should be associated with a positive experience like completing a level successfully or in my case marking an episode as watched. Before showing the prompt, I check if 7 days have passed since the first launch.

// check if 7 days have passed since the first launch
if let next = Calendar.current.date(byAdding: .day, value: 7, to: firstLaunchDate), next < Date() {
	SKStoreReviewController.requestReview()
}

When working with dates it is always a good idea to make use of the Calendar API instead of calculating with 3600 seconds per hour or 24 hours a day. The API from SKStoreReviewController itself is pretty straightforward. When we take a look at the documentation we can see that it only has one class function requestReview() which tells StoreKit to ask the user to rate or review your app, if appropriate.

The code snippet above still has one issue. We don’t take into account if we have already asked the user to rate the app. Remember, this is important because we don’t want to annoy the user and be careful because we can show the prompt only 3 times a year. To take this into account, I store the date when the prompt was last presented besides the date for the first launch.

if let last = lastReviewDate, let next = Calendar.current.date(byAdding: .month, value: 4, to: last), next < Date() {
	SKStoreReviewController.requestReview()
}

In the code snippet above we first have to check if lastRequestReview is not nil. When the lastReviewDate is nil, we haven’t asked the user for a rating so far, and we can continue and check if 7 days have passed since the first launch. When the lastReviewDate is not nil we can add the amount of time we want to wait, in our case 4 months and compare it with today.

The Result

The result is incredible. Since I implemented this feature in late September, I got almost 120 reviews where most of them have been 5 stars (4.7 average). This not only makes me happy but may also helps in convincing potential buyers that your app is worth their money. As you can see, adding SKStoreReviewController is very easy and the return of investment is huge. Thanks Apple for adding such a great API!

couchy rating overview with an average rating of 4.7