检查我的IOS应用程序是否已更新

我需要检查我的应用程序何时启动,如果它正在更新,因为我需要创建一个视图,仅在首次安装应用程序时才会出现,以便在更新后再次显示。

您可以将值(例如当前应用程序版本号)保存到NSUserDefaults并在每次用户启动应用程序时进行检查。

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // ... NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSString *currentAppVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; NSString *previousVersion = [defaults objectForKey:@"appVersion"]; if (!previousVersion) { // first launch // ... [defaults setObject:currentAppVersion forKey:@"appVersion"]; [defaults synchronize]; } else if ([previousVersion isEqualToString:currentAppVersion]) { // same version } else { // other version // ... [defaults setObject:currentAppVersion forKey:@"appVersion"]; [defaults synchronize]; } return YES; } 

swift-2版本看起来像这样:

 let defaults = NSUserDefaults.standardUserDefaults() let currentAppVersion = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String let previousVersion = defaults.stringForKey("appVersion") if previousVersion == nil { // first launch defaults.setObject(currentAppVersion, forKey: "appVersion") defaults.synchronize() } else if previousVersion == currentAppVersion { // same version } else { // other version defaults.setObject(currentAppVersion, forKey: "appVersion") defaults.synchronize() } 

swift-3版本看起来像这样:

 let defaults = UserDefaults.standard let currentAppVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String let previousVersion = defaults.string(forKey: "appVersion") if previousVersion == nil { // first launch defaults.set(currentAppVersion, forKey: "appVersion") defaults.synchronize() } else if previousVersion == currentAppVersion { // same version } else { // other version defaults.set(currentAppVersion, forKey: "appVersion") defaults.synchronize() } 

您可以在NSUserDefaults中存储应用程序版本号,并在每次启动应用程序时进行检查。 如果号码不可用,则为全新安装。 如果它被更改,则是升级。

快速版本与已接受的答案相比有了重大改进:

  • 使用infoDictionary而不是objectForInfoDictionaryKey保证结果独立于设备语言,否则你可能会在极少数情况下认为存在升级,而实际上它只是设备语言的变化
  • 使用与主Bundle infoDictionary相同的UserDefaults键,以明确存储的内容
  • 分解设置currentVersion代码
  • Swift 3语法

码:

  let standardUserDefaults = UserDefaults.standard let shortVersionKey = "CFBundleShortVersionString" let currentVersion = Bundle.main.infoDictionary![shortVersionKey] as! String let previousVersion = standardUserDefaults.object(forKey: shortVersionKey) as? String if previousVersion == currentVersion { // same version } else { // replace with `if let previousVersion = previousVersion {` if you need the exact value if previousVersion != nil { // new version } else { // first launch } standardUserDefaults.set(currentVersion, forKey: shortVersionKey) standardUserDefaults.synchronize() } 

Swift 3.x

只需在app启动时初始化AppVersionUpdateNotifier并遵循AppUpdateNotifier协议即可享受。

 class AppVersionUpdateNotifier { static let KEY_APP_VERSION = "key_app_version" static let shared = AppVersionUpdateNotifier() private let userDefault:UserDefaults private var delegate:AppUpdateNotifier? private init() { self.userDefault = UserDefaults.standard } func initNotifier(_ delegate:AppUpdateNotifier) { self.delegate = delegate checkVersionAndnotify() } private func checkVersionAndnotify() { let versionOfLastRun = userDefault.object(forKey: AppVersionUpdateNotifier.KEY_APP_VERSION) as? Int let currentVersion = Int(Bundle.main.buildVersion)! if versionOfLastRun == nil { // First start after installing the app } else if versionOfLastRun != currentVersion { // App was updated since last run delegate?.onVersionUpdate(newVersion: currentVersion, oldVersion: versionOfLastRun!) } else { // nothing changed } userDefault.set(currentVersion, forKey: AppVersionUpdateNotifier.KEY_APP_VERSION) } } protocol AppUpdateNotifier { func onFirstLaunch() func onVersionUpdate(newVersion:Int, oldVersion:Int) } extension Bundle { var shortVersion: String { return infoDictionary!["CFBundleShortVersionString"] as! String } var buildVersion: String { return infoDictionary!["CFBundleVersion"] as! String } } //************************* //Use: Example //************************* extention AppDelagate: AppUpdateNotifier { func onVersionUpdate(newVersion: Int, oldVersion: Int) { // do something } func onFirstLaunch() { //do something } } 

这是一个简单的代码,以了解当前版本是否不同(此代码也适用于模拟器。)

 -(BOOL) needsUpdate { NSDictionary* infoDictionary = [[NSBundle mainBundle] infoDictionary]; NSString* appID = infoDictionary[@"CFBundleIdentifier"]; NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"http://itunes.apple.com/lookup?bundleId=%@", appID]]; NSData* data = [NSData dataWithContentsOfURL:url]; NSDictionary* lookup = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; if ([lookup[@"resultCount"] integerValue] == 1) { NSString* appStoreVersion = lookup[@"results"][0][@"version"]; NSString* currentVersion = infoDictionary[@"CFBundleShortVersionString"]; if (![appStoreVersion isEqualToString:currentVersion]) { NSLog(@"Need to update [%@ != %@]", appStoreVersion, currentVersion); return YES; } } return NO; } 

注意:确保在iTunes中输入新版本时,这与您要发布的应用程序中的版本相匹配。 如果没有,则无论用户是否更新,上述代码将始终返回YES。