2013-06-03 1 views
15

Je dois vérifier quand mon application est lancée si elle a été mise à jour, car j'ai besoin de pour que l'affichage apparaisse uniquement lorsque l'application est d'abord installée pour apparaître à nouveau après avoir été mise à jour .Vérifiez si mon application IOS est mise à jour

+2

vous avez besoin d'élaborer sur cette question: Qu'est-ce qui est en train d'être mis à jour? l'application elle-même ou des fichiers dans l'application ou des fichiers à télécharger à partir d'un serveur distant? –

+0

l'application elle-même est en cours de mise à jour – user2412870

Répondre

34

Vous pouvez enregistrer une valeur (par exemple, le numéro de version de l'application actuelle) à NSUserDefaults et la vérifier chaque fois que l'utilisateur démarre l'application.

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

La version ressemble à ceci:

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

La version ressemble à ceci:

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

comment nous vérifions si l'application déjà livré ne supporte pas le mécanisme ci-dessus? – damithH

+3

@damithH Si votre application expédiée utilisait NSUserDefaults, vérifiez simplement l'existence de la clé que vous utilisiez. –

6

Vous pouvez stocker un numéro de version d'application dans NSUserDefaults et le vérifier chaque fois que votre application est lancée. Si le numéro n'est pas disponible, c'est une nouvelle installation. Si c'est changé, c'est une mise à jour.

+0

J'ai lu qu'après une mise à jour le NSUserDefaults n'est pas supprimé, ce qui ne m'aiderait pas, cela fonctionnerait si un utilisateur supprime l'application d'abord et la réinstalle – user2412870

+1

@ user2412870 Stockez votre numéro de version dans NSUserDefaults et vérifier, si elle est mise à jour, vous pouvez vérifier si le numéro de version est similaire au numéro enregistré dans NSUserDefaults – pre

3

version avec une amélioration importante par rapport à la réponse acceptée:

  • à l'aide infoDictionary au lieu de objectForInfoDictionaryKey garantit que le résultat est indépendant de la langue de l'appareil, sinon vous risquez de finir dans certains cas rares croire qu'il ya une mise à niveau, alors qu'en réalité il est juste un changement de langue de l'appareil
  • en utilisant un UserDefaults clé identique au principal Bundle infoDictionary pour plus de clarté sur ce qui est exactement stocké
  • paramètre affacturage code currentVersion
  • Swift 3 syntaxe

code:

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

3.x Swift

Juste au lancement AppVersionUpdateNotifier initialiser app et AppUpdateNotifier protocole conforme, profitez.

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 
    } 
} 
0

Voici un code simple pour savoir si la version actuelle est différente

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

Note (ce travail de code sur simulateur aussi.): Assurez-vous que lorsque vous entrez dans la nouvelle version dans iTunes, cela correspond à la version de l'application que vous libérez. Si ce n'est pas le cas, le code ci-dessus retournera toujours YES indépendamment de la mise à jour de l'utilisateur.

Questions connexes