// Copyright © 2015 Abhishek Banthia import Cocoa import StoreKit final class ReviewController { private static var storage = UserDefaults.standard private static var debugging = false private enum Keys { static let lastPrompt = "last-prompt" static let lastVersion = "last-version" static let install = "install" } class func applicationDidLaunch(_ defaults: UserDefaults) { if ProcessInfo.processInfo.arguments.contains(UserDefaultKeys.testingLaunchArgument) { debugging = true } storage = defaults if defaults.object(forKey: Keys.install) == nil { defaults.set(Date(), forKey: Keys.install) } } class func setPreviewMode(_ value: Bool) { debugging = value } class func prompted() { storage.set(Date(), forKey: Keys.lastPrompt) storage.set(Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as? String, forKey: Keys.lastVersion) } class func canPrompt() -> Bool { if debugging == true { return true } let day: TimeInterval = -1 * 60 * 60 * 24 let minInstall: TimeInterval = day * 7 // Check if the app has been installed for atleast 7 days guard let install = storage.object(forKey: Keys.install) as? Date, install.timeIntervalSinceNow < minInstall else { return false } // If we have never been prompted before, go ahead and prompt guard let lastPrompt = storage.object(forKey: Keys.lastPrompt) as? Date, let lastVersion = storage.object(forKey: Keys.lastVersion) as? String else { return true } // Minimum interval between two versions should be 3 months let minInterval: TimeInterval = day * 90 // never prompt w/in the same version return lastVersion != (Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as? String) // limit all types of prompts to at least 1mo intervals && lastPrompt.timeIntervalSinceNow < minInterval } class func prompt() { SKStoreReviewController.requestReview() prompted() } }