2009-09-29 7 views

Répondre

24

Après des recherches plus poussées et des essais, je me suis trouvé la solution.

NSDictionary* infoDictionary = [[NSBundle mainBundle] infoDictionary]; 
NSLog(@"%i Keys: %@", [infoDictionary count], 
      [[infoDictionary allKeys] componentsJoinedByString: @" ,"]); 

Ce snipplet m'a donné le résultat suivant:

20 Clés: NSBundleResolvedPath, CFBundleVersion, NSBundleInitialPath, CFBundleIdentifier, NSMainNibFile, CFBundleIconFile, CFBundleInfoPlistURL, CFBundleExecutable, DTSDKName, UIStatusBarStyle, CFBundleDevelopmentRegion, DTPlatformName, CFBundleInfoDictionaryVersion, CFBundleSupportedPlatforms, CFBundleExecutablePath, CFBundleDisplayName, LSRequiresIPhoneOS, CFBundlePackageType, CFBundleSignature, CFBundleName

Donc, la solution est aussi simple que:

NSString *version =[[[NSBundle mainBundle] infoDictionary] valueForKey:@"CFBundleVersion"]; 

Cependant, cela est pas la version du projet actuel comme on le voit dans la capture d'écran, mais la version Bundle du fichier plist.

+1

Je pense que le versionnage inclut l'ajout de référentiels et la configuration de SCM pour votre projet en XCode et ce n'est probablement pas la version que vous voulez (bien que je puisse me tromper). – Eimantas

+0

Si vous définissez la valeur CFBundleVersion dans votre fichier plist sur $ {CURRENT_PROJECT_VERSION}, elle sera remplacée par les paramètres de construction de la version actuelle du projet. Vous pouvez ensuite utiliser agvtool bump pour incrémenter le numéro de build. – mjk

+2

De plus, le 'CFString'' kCFBundleVersionKey' pourrait être utilisé à la place de la chaîne codée en dur '@" CFBundleVersion "', converti en 'NSString' si nécessaire, comme cela serait requis dans le code ci-dessus. – trss

12

Regardez dans votre fichier Info.plist qui devrait avoir des clés comme CFBundleVersion et CFBundleShortVersionString

+6

Plus d'info: http://developer.apple.com/mac/library/documentation/MacOSX/Conceptual/BPRuntimeConfig/ Articles/PListKeys.html # // apple_ref/doc/uid/20001431-102364 http://www.dribin.org/dave/blog/archives/2006/08/02/versioning_os_x_apps/ –

+0

ghommey - il y a un guide pour la liste programmation sur developer.apple.com. – Eimantas

7

Ces éléments des Infos de construction ne sont pas disponibles dans votre application intégrée. Ils sont des espaces réservés que vous pourriez éventuellement tirer dans votre application. Ce qui se trouve dans votre application est tout ce que vous placez, disons, dans le dossier Ressources de votre application, comme n'importe quel fichier texte ou pliste, ou une belle image de votre ingénieur de version.

Maintenant, vous pouvez extraire certains des éléments de la fenêtre Infos de construction dans info.plist, en utilisant des identifiants spéciaux, tels que $ {VERSION_INFO_PREFIX} ou un autre jeton. Les jetons sont disponibles si vous cliquez sur l'un des éléments sur le côté gauche dans la fenêtre que vous avez incluse ci-dessus. Par exemple, cliquez sur le mot "Current Project Version" et copiez le jeton que vous voyez en bas, "CURRENT_PROJECT_VERSION". Ensuite, allez dans votre fichier plist, et ajoutez une entrée. Donnez-lui le nom que vous voulez ou "Version actuelle du projet". Collez $ {CURRENT_PROJECT_VERSION} sur le côté droit. Maintenant, cette valeur est disponible pour vous depuis votre application, par programme. Bien sûr, quelqu'un doit maintenant entrer cette valeur dans l'endroit approprié, soit dans la fenêtre Build Info, soit ailleurs. Il pourrait être plus simple de gérer ceci et des champs comme celui-ci dans le fichier info.plist. C'est à vous de décider comment vous voulez gérer ces choses.

Voici comment je Informez-vous sur la version de mon info.plist:

+ (NSString *) getAppVersionNumber; 
{ 
    NSString *myVersion, 
       *buildNum, 
       *versText; 

    myVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]; 
    buildNum = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleVersionKey]; 
    if (myVersion) { 
     if (buildNum) 
      versText = [NSString stringWithFormat:@"Version: %@ (%@)", myVersion, buildNum]; 
     else 
      versText = [NSString stringWithFormat:@"Version: %@", myVersion]; 
    } 
    else if (buildNum) 
     versText = [NSString stringWithFormat:@"Version: %@", buildNum]; 
    NSLog(versText); 
    return versText; 
} 
+0

"Valeur indéfinie ou garbage retournée à l'appelant"! Supprimer versText et mettre une déclaration de retour sur sa position. À la fin, retour nul. – testing

+1

Ne pas "NSLog" comme ça. Il devrait être 'NSLog (@"% @ ", versText);'. Si 'versText' reste indéfini, ce qui est possible à partir du code, cela provoquera un plantage. – Mundi

4
NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] valueForKey:@"CFBundleVersion"]; 

me retourne toujours la même valeur (version initiale), même si je change la version des paramètres du projet, mais.

NSString * appVersionString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; 

fait l'affaire.

+0

CFBundleVersion - un code d'assemblage. Pas une chaîne de version. – ETech

1

Pour le paresseux est ici la version rapide:

NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString")! 
1

NSBundle.mainBundle.infoDictionary[@"CFBundleShortVersionString"];

Questions connexes