如何检测安装或升级的iOS应用程序?

我正在开发一个应用程序,我需要知道用户是第一次安装应用程序还是从App Store升级它。

我如何检测应用程序是第一次安装还是升级或重新安装?

提前感谢您的回答。

您可以通过将最新的已知版本保存到standardUserDefaults来区分安装App之后的第一次启动,更新之后的第一次启动以及其他启动。 但据我所知,这是不可能的检测到应用程序的重新安装,因为所有的应用程序相关的数据也被删除,当从设备中删除应用程序。

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSString* currentVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]; NSString* versionOfLastRun = [[NSUserDefaults standardUserDefaults] objectForKey:@"VersionOfLastRun"]; if (versionOfLastRun == nil) { // First start after installing the app } else if (![versionOfLastRun isEqual:currentVersion]) { // App was updated since last run } else { // nothing changed } [[NSUserDefaults standardUserDefaults] setObject:currentVersion forKey:@"VersionOfLastRun"]; [[NSUserDefaults standardUserDefaults] synchronize]; } 

签出Swift 3.0版本的代码。
注意:使用CFBundleShortVersionString来检查实际的App版本检查。

 func checkAppUpgrade() { let currentVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String let versionOfLastRun = UserDefaults.standard.object(forKey: "VersionOfLastRun") as? String if versionOfLastRun == nil { // First start after installing the app } else if versionOfLastRun != currentVersion { // App was updated since last run } else { // nothing changed } UserDefaults.standard.set(currentVersion, forKey: "VersionOfLastRun") UserDefaults.standard.synchronize() } 

对于Swift 3

  let currentVersion : String = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String let versionOfLastRun: String? = UserDefaults.standard.object(forKey: "VersionOfLastRun") as? String if versionOfLastRun == nil { // First start after installing the app } else if !(versionOfLastRun?.isEqual(currentVersion))! { // App is updated } UserDefaults.standard.set(currentVersion, forKey: "VersionOfLastRun") UserDefaults.standard.synchronize() 

只是为了说明:

要获得任何键的本地化值,您应该使用CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), "CFBundleShortVersionString" as CFString)

请在NSUserDefaults (per @ Nero的答案)中存储一个版本,以检查(可能的)全新安装和后续更新。

为了检查重新安装(在存储version == nil的情况下),利用iOS 11引入的DeviceCheck API,它公开了可以由应用程序设置和检索的两个设备特定数据位,但是由Apple维护,并且通过卸载/重新安装。