26

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

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

提前感谢您的回答。

4

5 回答 5

38

您可以通过将最新的已知版本保存到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];
}
于 2014-03-01T19:41:47.123 回答
19

签出 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()
}
于 2017-02-10T06:16:45.457 回答
4

对于斯威夫特 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()
于 2017-07-11T11:42:12.137 回答
0

只是为了注意:

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

于 2017-04-01T05:16:05.520 回答
0

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

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

于 2017-06-20T12:27:03.667 回答