How to use requestReview (SKStore​Review​Controller) to show review popup in the current viewController after a random period of time

老子叫甜甜 提交于 2019-12-02 20:28:35
Michael Sacks

In your AppDelegate:

Swift:

import StoreKit

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    let shortestTime: UInt32 = 50
    let longestTime: UInt32 = 500
    guard let timeInterval = TimeInterval(exactly: arc4random_uniform(longestTime - shortestTime) + shortestTime) else { return true }

    Timer.scheduledTimer(timeInterval: timeInterval, target: self, selector: #selector(AppDelegate.requestReview), userInfo: nil, repeats: false)

}

@objc func requestReview() {
    SKStoreReviewController.requestReview()
}

Objective-C:

#import <StoreKit/StoreKit.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    int shortestTime = 50;
    int longestTime = 500;
    int timeInterval = arc4random_uniform(longestTime - shortestTime) + shortestTime;

    [NSTimer scheduledTimerWithTimeInterval:timeInterval target:self selector:@selector(requestReview) userInfo:nil repeats:NO];
}

- (void)requestReview {
    [SKStoreReviewController requestReview];
}

The code above will ask Apple to prompt the user to rate the app at a random time between 50 and 500 seconds after the app finishes launching. Remember that according to Apple's docs, there is no guarantee that the rating prompt will be presented when the requestReview is called.

For Objective - C:

Add StoreKit.framework

Then in your viewController.h

#import <StoreKit/StoreKit.h>

Then in your function call :

            [SKStoreReviewController requestReview];

For Swift

Add StoreKit.framework

In your ViewController.swift

import StoreKit

Then in your function call :

SKStoreReviewController.requestReview()

That's it ! Apple will take care of when it would show the rating (randomly). When in development it will get called every time you call it.

Edited : No need to check OS version, StoreKit won't popup if the OS is less than 10.3, thank Zakaria.

Popping up at a random time is not a good way to use that routine, and is not only in contravention of Apple's advice, but will give you less-than-great results.

Annoying the user with a pop up at a random time will never be as successful as prompting them at an appropriate time- such as when they have just completed a level or created a document, and have that warm fuzzy feeling of achievement.

Taking Peter Johnson's advice, I created a simple class where you can just stick the method in at the desired spot in your code and it'll pop up at a spot where the user's just had a success.

struct DefaultKeys {
  static let uses = "uses"
}


class ReviewUtility {

  //  Default Keys stored in Structs.swift

  static let sharedInstance = ReviewUtility()

  private init() {}

  func recordLaunch() {
    let defaults = UserDefaults.standard

    // if there's no value set when the app launches, create one
    guard defaults.value(forKey: DefaultKeys.uses) != nil else { defaults.set(1, forKey: DefaultKeys.uses); return }
    // read the value
    var totalLaunches: Int = defaults.value(forKey: DefaultKeys.uses) as! Int
    // increment it
    totalLaunches += 1
    // write the new value
    UserDefaults.standard.set(totalLaunches, forKey: DefaultKeys.uses)

    // pick whatever interval you want
    if totalLaunches % 20 == 0 {
      // not sure if necessary, but being neurotic
      if #available(iOS 10.3, *) {
        // do storekit review here
        SKStoreReviewController.requestReview()
      }
    }
  }
}

To use it, stick this where you want it to be called and hopefully you won't tick off users with randomness.

ReviewUtility.sharedInstance.recordLaunch()

Showing the dialog at random time is not probably a good idea. Please see the Apple guideline which mentions: Don’t interrupt the user, especially when they’re performing a time-sensitive or stressful task.

This is what Apple suggests:

Ask for a rating only after the user has demonstrated engagement with your app. For example, prompt the user upon the completion of a game level or productivity task. Never ask for a rating on first launch or during onboarding. Allow ample time to form an opinion.

Don’t be a pest. Repeated rating prompts can be irritating, and may even negatively influence the user’s opinion of your app. Allow at least a week or two between rating requests and only prompt again after the user has demonstrated additional engagement with your app.

This post is also quite interesting...

I cant add comments yet but if you are using Appirater you might want to check the version to see if its lower than 10.3 so the other Appirater review message box pops up.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!