J'écris une application iPhone. Cela a déjà été publié, mais je voudrais ajouter une fonctionnalité où son numéro de version est affiché.
Je préférerais ne pas avoir à le faire manuellement avec chaque version que je publie ...
Existe-t-il un moyen dans objectif-C de savoir quelle est la version de mon application?
Comme je le décris ici , j'utilise un script pour réécrire un fichier d'en-tête avec mon numéro de révision Subversion actuel. Ce numéro de révision est stocké dans la constante kRevisionNumber. Je peux ensuite accéder à la version et au numéro de révision en utilisant quelque chose de similaire au suivant:
[NSString stringWithFormat:@"Version %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"], kRevisionNumber]
ce qui créera une chaîne du format "Version 1.0 (51)".
S'appuyant sur la réponse de Brad Larson, si vous avez des informations de version majeure et mineure stockées dans le pliste info (comme je l'ai fait pour un projet particulier), cela a bien fonctionné pour moi:
- (NSString *)appNameAndVersionNumberDisplayString {
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
NSString *appDisplayName = [infoDictionary objectForKey:@"CFBundleDisplayName"];
NSString *majorVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
NSString *minorVersion = [infoDictionary objectForKey:@"CFBundleVersion"];
return [NSString stringWithFormat:@"%@, Version %@ (%@)",
appDisplayName, majorVersion, minorVersion];
}
Maintenant, réviser manuellement une version mineure peut être un problème, et l’utilisation d’un numéro de révision du référentiel source est donc idéale. Si vous ne l'avez pas lié (comme je ne l'avais pas fait), l'extrait ci-dessus peut être utile. Il extrait également le nom d'affichage de l'application.
Version rapide pour les deux séparément:
Swift 3
let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String
Swift 2
let versionNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
let buildNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String
Son inclus dans ce repo, regardez-le:
C'est ce que j'ai fait dans ma candidature
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
Espérons que cette réponse simple aidera quelqu'un ...
Vous pouvez spécifier la chaîne CFBundleShortVersionString
dans votre fichier plist.info et la lire par programme à l'aide de API fournie .
Il y a deux choses - construire la version et la version de l'application.
Pour obtenir la version de l'application:
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
Pour obtenir la version de construction:
NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
// Syncs with App Store and Xcode Project Settings Input
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
Une manière succincte d’obtenir une chaîne de version au format X.Y.Z est:
[NSBundle mainBundle].infoDictionary[@"CFBundleVersion"]
Ou, pour juste X.Y:
[NSBundle mainBundle].infoDictionary[@"CFBundleShortVersionString"]
Ces deux extraits renvoient des chaînes que vous affecteriez à la propriété text de votre objet étiquette, par exemple.
myLabel.text = [NSBundle mainBundle].infoDictionary[@"CFBundleVersion"];
Vous pouvez essayer d'utiliser dictionnaire comme: -
NSDictionary *infoDictionary = [[NSBundle mainBundle]infoDictionary];
NSString *buildVersion = infoDictionary[(NSString*)kCFBundleVersionKey];
NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey]
Vous pouvez utiliser l'infoDictionary qui obtient les détails de la version de info.plist de votre application. Ce code fonctionne pour Swift 3. Appelez simplement cette méthode et affichez la version dans n'importe quel élément d'interface utilisateur préféré.
Swift-3
func getVersion() -> String {
let dictionary = Bundle.main.infoDictionary!
let version = dictionary["CFBundleShortVersionString"] as! String
let build = dictionary["CFBundleVersion"] as! String
return "v\(version).\(build)"
}
Lisez le fichier info.plist de votre application et obtenez la valeur pour la clé CFBundleShortVersionString. La lecture de info.plist vous donnera un objet NSDictionary
Si vous avez besoin d'une combinaison des deux version et de build num, voici un bref moyen d'utilisation de - Swift:
let appVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"]!
let buildNum = Bundle.main.infoDictionary!["CFBundleVersion"]!
let versionInfo = "\(appVersion) (build \(buildNum))"
// versionInfo is now something like "2.3.0 (build 17)"
Ajoutez un as! String
à la fin de la ligne appVersion
ou buildNum
pour obtenir uniquement cette partie sous la forme d'un objet String
. Pas besoin de ça si vous cherchez la version complète versionInfo
.
J'espère que ça aide!
Vous pouvez essayer cette méthode:
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
C'est une bonne chose à gérer avec un système de contrôle de révision. Ainsi, lorsque vous recevez un rapport de bogue d'un utilisateur, vous pouvez vérifier cette révision de code et (espérons-le) reproduire le bogue qui exécute exactement le même code que l'utilisateur.
L'idée est que chaque fois que vous construisez, vous allez exécuter un script qui récupère le numéro de révision actuel de votre code et met à jour un fichier au sein de votre projet (généralement avec une forme de remplacement de jeton). Vous pouvez ensuite écrire une routine de traitement des erreurs qui inclut toujours le numéro de révision dans la sortie d'erreur ou vous pouvez l'afficher dans une page "À propos de".
func getAppVersion() -> String {
let dictionary = Bundle.main.infoDictionary!
let versionValue = dictionary["CFBundleShortVersionString"] ?? "0"
let buildValue = dictionary["CFBundleVersion"] ?? "0"
return "\(versionValue) (build \(buildValue))"
}
Basé sur @rajat chauhan, répondez sans transtypage forcé à String
.