关于安装:如何检测已安装或升级的iOS App?

How to detect an iOS App installed or upgraded?

本问题已经有最佳答案,请猛点这里访问。

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

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

非常感谢您的回答。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- (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来检查实际的应用程序版本检查。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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

1
2
3
4
5
6
7
8
9
10
11
12
 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()

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

对于检查重新安装(在存储为version == nil的情况下),请利用iOS 11引入的DeviceCheck API,该API公开了设备专用数据的两位数据,这些数据可由应用程序设置和检索,但由Apple和在卸载/重新安装后仍然存在。


请注意:

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