In che modo la mia app per iPhone può rilevare il proprio numero di versione?


254

Sto scrivendo un'app per iPhone. È già stato pubblicato, ma vorrei aggiungere una funzione in cui è visualizzato il suo numero di versione.

Preferirei non doverlo fare manualmente con ogni versione che rilascio ...

C'è un modo in obiettivo-C per scoprire qual è la versione della mia app?


1
A questa domanda è già stata data una risposta qui stackoverflow.com/a/16888788/2890157 .
Akshat Singhal,

1
.. la domanda collegata è 4 anni dopo, quindi il vero problema qui è che i cmos non hanno mai accettato una risposta. Indipendentemente da ciò, le risposte alla domanda collegata sono utili, così come le risposte qui. Su entrambi i thread, guarda oltre la prima risposta - a volte ci sono più informazioni aggiornate su una risposta successiva.
ToolmakerSteve

Risposte:


222

Come descrivo qui , utilizzo uno script per riscrivere un file di intestazione con il mio attuale numero di revisione di Subversion. Quel numero di revisione è memorizzato nella costante kRevisionNumber. Posso quindi accedere alla versione e al numero di revisione usando qualcosa di simile al seguente:

[NSString stringWithFormat:@"Version %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"], kRevisionNumber]

che creerà una stringa del formato "Versione 1.0 (51)".


152
Che ha restituito la mia versione build quindi ho usato questo. [[[NSBundle mainBundle] infoDictionary] objectForKey: @ "CFBundleShortVersionString"]
jspooner

6
CFBundleVersion non è corretto, poiché Xcode popola erroneamente quella voce del plist con il numero di build e non il numero di versione. jspooner è corretto.
Oscar

4
Vedi stackoverflow.com/questions/6851660/version-vs-build-in-xcode-4 per una grande spiegazione dei numeri di versione e build. Conferma che CFBundleShortVersionStringquello che vorresti normalmente per 'versione' e CFBundleVersionper numero di build.
Rory,

3
kRevisionNumber non sembra funzionare per me. Per ottenere l'output specificato ho fatto questo (usando la correzione di @jspooner):[NSString stringWithFormat:@"Version: %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"], [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]]
Adam

147

Basandomi sulla risposta di Brad Larson, se hai informazioni sulla versione principale e secondaria memorizzate nella scheda informazioni (come ho fatto per un particolare progetto), questo ha funzionato bene per me:

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

Ora rivedere manualmente una versione minore può essere una seccatura, quindi è l'ideale usare un trucco per il numero di revisione del repository di origine. Se non l'hai collegato (come non avevo fatto), il frammento di cui sopra può essere utile. Estrae anche il nome visualizzato dell'app.


59

Versione rapida per entrambi separatamente:

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

È incluso in questo repository, dai un'occhiata:

https://github.com/goktugyil/EZSwiftExtensions


42

Questo è quello che ho fatto nella mia domanda

NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

Spero che questa semplice risposta possa aiutare qualcuno ...


1
Per le mie esigenze, è fantastico. Grazie. +1
David DelMonte

1
Questo restituisce il nome della build, non la versione
chancyWu

@chancyWu, CFBundleShortVersionString sembra dare la versione.
Brian F Leighty,


30

Ci sono due cose: costruire la versione e la versione dell'app.

  1. Per ottenere la versione dell'app:

    NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
  2. Per ottenere la versione build:

    NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

C'è qualche differenza tra questi due? Entrambi restituiscono lo stesso per me.
jjnevis,

sì, il numero di build e la versione dell'app potrebbero essere uguali nelle impostazioni.
Shaik Riyaz,

Ok, ho solo un'impostazione nel mio RAKEFILE - app.version (sto usando RubyMotion). Immagino che lo farà per le mie esigenze. Grazie
jjnevis il

Grazie compagno. Ha funzionato senza problemi.
Felipe,

1
Cordiali saluti È preferibile utilizzare objectForInfoDictionaryKey:invece che infoDictionary] objectForKey:perché il primo restituisce il valore localizzato (se presente). Probabilmente qui non farà differenza;)
deanWombourne,

17
// Syncs with App Store and Xcode Project Settings Input
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];

1
Esattamente quello di cui avevo bisogno!
Giulio

16

Un modo sintetico per ottenere una stringa di versione in formato XYZ è:

[NSBundle mainBundle].infoDictionary[@"CFBundleVersion"]

Oppure, solo per XY:

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

Entrambi questi frammenti restituiscono stringhe che assegneresti alla proprietà text dell'oggetto etichetta, ad es

myLabel.text = [NSBundle mainBundle].infoDictionary[@"CFBundleVersion"];

7

Puoi provare a usare il dizionario come: -

NSDictionary *infoDictionary = [[NSBundle mainBundle]infoDictionary];

NSString *buildVersion = infoDictionary[(NSString*)kCFBundleVersionKey];
NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey]

4

Leggi il file info.plist della tua app e ottieni il valore per la chiave CFBundleShortVersionString. La lettura di info.plist ti darà un oggetto NSDictionary


4

Puoi usare infoDictionary che ottiene i dettagli della versione da info.plist della tua app. Questo codice funziona per swift 3. Basta chiamare questo metodo e visualizzare la versione in qualsiasi elemento dell'interfaccia utente preferito.

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

3

Swift 5:

Ci sono due cose: versione dell'app e versione build

  • Per ottenere la versione dell'app:

     if let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
          // present appVersion
    }
  • Per ottenere la versione build:

     if let buildVersion = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
          // present buildVersion
     }

Grazie @Brad Larson♦mille


1

Se hai bisogno di una combinazione di entrambe le versioni e build num , ecco un breve modo usando Swift 3 :

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

Aggiungi un as! Stringalla fine della riga appVersiono buildNumper ottenere solo quella porzione come Stringoggetto. Non ce n'è bisogno, tuttavia, se stai cercando il massimo versionInfo.

Spero che aiuti!


1
func getAppVersion() -> String {
    let dictionary = Bundle.main.infoDictionary!
    let versionValue = dictionary["CFBundleShortVersionString"] ?? "0"
    let buildValue = dictionary["CFBundleVersion"] ?? "0"
    return "\(versionValue) (build \(buildValue))"
}

Basato sulla risposta di @rajat chauhan senza cast forzato String.


0

Questa è una buona cosa da gestire con un sistema di controllo delle revisioni. In questo modo, quando ricevi una segnalazione di bug da un utente, puoi controllare quella revisione del codice e (si spera) riprodurre il bug che esegue esattamente lo stesso codice dell'utente.

L'idea è che ogni volta che fai una build, eseguirai uno script che ottiene l'attuale numero di revisione del tuo codice e aggiorna un file all'interno del tuo progetto (di solito con una qualche forma di sostituzione del token). È quindi possibile scrivere una routine di gestione degli errori che includa sempre il numero di revisione nell'output dell'errore oppure è possibile visualizzarlo su una pagina "Informazioni".


0

Puoi provare questo metodo:

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.