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

时间:2014-03-01 19:04:47

标签: ios install upgrade reinstall

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

如何检测应用是首次安装还是升级或重新安装?

提前感谢您的回答。

5 个答案:

答案 0 :(得分:32)

您可以通过将最新的已知版本保存到standardUserDefaults来区分安装应用后的第一次启动,更新后的第一次启动以及其他非常轻松的启动。但据我所知,无法检测到重新安装应用程序,因为从应用程序中删除应用程序时,所有与应用程序相关的数据也会被删除。

- (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];
}

答案 1 :(得分:11)

Checkout 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()
}

答案 2 :(得分:1)

对于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()

答案 3 :(得分:0)

仅供注意:

要获取任何密钥的本地化值,您应使用CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), "CFBundleShortVersionString" as CFString)

答案 4 :(得分:0)

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

为了检查重新安装(在存储version == nil的情况下),利用iOS 11的DeviceCheck API介绍,该API公开了两位设备特定数据,这些数据可由设置和检索应用程序,但由Apple维护并持续卸载/重新安装。