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

如何检测已安装或升级的iOS应用程序?,ios,installation,upgrade,reinstall,Ios,Installation,Upgrade,Reinstall,我正在开发一个应用程序,我需要知道用户是第一次安装该应用程序还是从应用程序商店升级它 如何检测应用程序是首次安装还是升级或重新安装 提前感谢您的回答。通过将已知的最新版本保存到standardUserDefaults,您可以轻松区分安装应用程序后的第一次启动、更新后的第一次启动和其他启动。但据我所知,不可能检测到应用程序的重新安装,因为从设备上删除应用程序时,所有与应用程序相关的数据也会被删除 - (BOOL)application:(UIApplication *)application di

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

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


提前感谢您的回答。

通过将已知的最新版本保存到
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];
}

签出Swift 3.0版本的代码。
注意:使用CbundleShortVersionString检查实际应用程序版本检查

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

请注意:


要获取任何键的本地化值,您应该使用
CbundleGetValueForInfoDictionaryKey(CbundleGetMainBundle(),“CbundleShortVersionString”作为CFString)

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

为了检查重新安装(如果存储的
版本==nil
),请利用iOS 11引入的API,该API公开两位设备特定数据,这些数据可由应用程序设置和检索,但由苹果维护,并在卸载/重新安装过程中保持。

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

也许将版本号存储到keychain会起作用?我认为卸载应用程序后不会删除钥匙链中的数据。你什么时候更新以前的版本?@Nero当我更改内部版本号(而不是版本号)时,这会起作用。有什么想法吗?@Sethmr哦,是的,你说得对。谢谢你注意到这一点
CbundLeverVersion
实际上返回Xcode调用的版本号,但是还有一个键
CbundleShortVersionString
返回您在项目编辑器中输入的版本号。版本号/版本号的标准格式需要实际记录,而不是允许完全和完全的自由使用!只有在看到这两个变量之后,我才意识到构建基本上是对版本的扩展。我以前只是把它当作一个不带“.”的Int来识别哪个版本。谢谢,Mate:)就像一个charm一样工作。这需要我从第一个版本开始设置,不是吗?如果有一个版本在那里,我想测试新的安装与更新在即将到来的更新@如果您已经发布了一个没有此代码的版本,并且希望检测升级,则SaggyThis将失败。@Rajashekar:当然可以。此代码在您没有此版本的版本上不起作用。