Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SKStore​Review​Controller: How are the limits handled?

My App does not actively prompt the user to rate the app on the App Store, it only includes a "Rate this app" page in the app settings. So the user has access the page manually and only after he taps on a Do Rate button, he is redirected to the App Store.

Of course the UI of SKStore​Review​Controller is much more straight forward than redirecting the user to the App Store app to leave his review. So I simply changed the call to the App Store URL to a call of [SKStore​Review​Controller requestReview].

This works fine in all my tests: The rating dialog is presented every time I tap the review button.

However I wonder how this will behave outside the debug environment in real live. According to the Apple docs, [SKStore​Review​Controller requestReview] is limited to 3 prompts per App per year.

  • How will the app behave once this limit is reached? Will pressing the review-button (= [SKStore​Review​Controller requestReview]) have no effect or will there be some kind of feedback?
  • How do I know if I can sill use [SKStore​Review​Controller requestReview] or if I have to send the user to the Store manually?
  • What exactly does 3 prompts per App per year mean? Is this really per App or per App Version?
  • Is there any limitation to the interval between two [SKStore​Review​Controller requestReview] calls? Is using it three days in a row as legit as using it every 4 month?
like image 818
Andrei Herford Avatar asked Aug 15 '17 15:08

Andrei Herford


1 Answers

Disclaimer

Although I can't quote an official response (and I can't guarantee how long these findings will remain true), I just spent some time reverse engineering the logic and it seems to be pretty simple.

Requesting a Review:

When you request a review, StoreKit sends a message to com.apple.itunesstored.xpc, which is responsible for enforcing and tracking limits. If request limits haven't been reached, the XPC process tracks the request and responds with an app review token. Otherwise, it responds with nil.

After the XPC response has been received, StoreKit checks to see whether the token was nil. If it is non-nil, an SKStoreReviewViewController is instantiated and presented in an internal UIWindow. Otherwise, the request is silently ignored. There is no callback or notification you can listen for, and while there is some code in the XPC handler for logging errors, I didn't see any sources of errors in the XPC process.

Validating Limits

As far as the logic behind the limits, it's quite simple. There are two conditions that must be met:

  1. The user must not be prompted more than three times in the past 365 days, regardless of app version.

  2. The user must not be prompted if they rated the app in a prior request, unless:

    • Their last rating was more than 365 days ago
    • AND The application version has changed

Although Apple recommends waiting for further engagement over a few weeks before requesting another prompt, at the moment, there is no logic that prevents you from prompting the user three times within three minutes. Those prompts will count for all three of your prompts for the next 365 days though.

tl;dr

  • StoreKit will silently ignore any excess requests and you can't determine when that happens.

  • Although you could track your requests yourself to know when you need to redirect to the App Store vs request a review, Apple may change the logic at any point in time. There is no way to programmatically query your limits.

  • Three prompts per year means three prompts within the past 365 days, regardless of app version. (Updating the app clears the "never prompted again" requirement though.)

  • There is no limitation of interval between two request review calls.

For your situation, I'd recommend using the new App Store URL that brings users directly to a review composition screen. This will work more consistently while still following the HIG guidelines (since it's in response to a button press).

To automatically open a page on which users can write a review in the App Store, append the query parameter action=write-review to your product URL.

like image 93
Ryan Pendleton Avatar answered Nov 01 '22 14:11

Ryan Pendleton