SKStoreReviewController how to detect that user has turned off Rate This App (RTA) in settings or 3 times limit has reached?

后端 未结 3 758
迷失自我
迷失自我 2021-02-01 20:19

Starting iOS 10.3, Apple is limiting the review prompt (Rate This App) to 3 times a year and it can be turned off in the user\'s settings.

Q: How do we detect that the 3

相关标签:
3条回答
  • 2021-02-01 20:25

    Preamble

    Asking users if they like the app might lead to your app being rejected. Here is an example: https://twitter.com/pietbrauer/status/791883047373246464

    In case the link dies here is an excerpt of Apples response:

    3.2.2 ... your app includes content and features that can manipulate the user reviews or chart rankings on the App Store. Specifically, your app filters user reviews and only directs users who intend to rate your app 4 - 5 stars to complete a rating on the App Store...

    I personally believe that this can be a valid tactic if you genuinely try to resolve the users issue, and still give them an opportunity to leave a review afterwards, but the question remains if Apple will see it that way.

    Possible solution

    1. Show popup asking the user if they enjoy/like/etc using the app.
    2. Try using [SKStoreReviewController requestReview] to get a review.
    3. Check if the number of windows has changed, indicating that a popup has been shown. The caveat here is that this is not 100% reliable since some other event can cause the number of windows to change.
    4. If the number of windows stays the same use deep linking to forward the user to the app store. The docs for SKStoreReviewController suggest using action=write-review as a query parameter to go directly to the reviews page.

    Here is a simple implementation:

    // make sure we the current iOS version supports in app reviews
    if ([SKStoreReviewController class])
    {
        NSUInteger windowCount = [UIApplication sharedApplication].windows.count;
        [SKStoreReviewController requestReview];
    
        // give the review controller some time to display the popup
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
            if (windowCount < [UIApplication sharedApplication].windows.count)
            {
                // assume review popup showed instead of some other system alert
                // for example show "thank you"
            }
            else
            {
                // open app store to leave review
                NSURL *reviewUrl = [NSURL URLWithString:@"{your-app-url}?action=write-review"];
                [[UIApplication sharedApplication] openURL:reviewUrl];
            }
        });
    }
    

    Note: I have not submitted this code to the App Store, so this is only theoretical.

    0 讨论(0)
  • 2021-02-01 20:43

    Well, you could try to fire the request and see but as long as there's no callback as well as no other official way how to detect whether the rating alert has been displayed at the time you call the requesting method.

    There is a way around however – one of the StoreKit classes can be swizzled so you can observe when the Rating dialog is opened.

    UIWindow-inspecting ways mentioned around may be useful as well, but swizzling on a method call is probably more reliable.

    You can also use some rating managers like AppRating available as a pod, which manage the stuff for you, but only on a naive level by counting the calls and remembering it.

    0 讨论(0)
  • 2021-02-01 20:48

    I am using this solution in production code - so far no rejections from Apple:

    NSUInteger windowCount = [UIApplication sharedApplication].windows.count;
    // SKStoreReviewController only available for >= 10.3, if needed check for class existence
    [SKStoreReviewController requestReview];
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
        BOOL shown = windowCount < [UIApplication sharedApplication].windows.count;
        if (shown) {
            //popup was shown
        }
    };
    
    0 讨论(0)
提交回复
热议问题