2009-09-29 14 views

risposta

24

Dopo ulteriori ricerche e test, ho trovato la soluzione io stesso.

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

Questo snipplet mi ha dato il seguente risultato:

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

Quindi la soluzione è semplice come:

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

Tuttavia, questo è non il progetto attuale versione come si vede nello screenshot, ma la versione bundle del file plist.

+1

Penso che il controllo delle versioni includa l'aggiunta di repository e l'impostazione di SCM per il tuo progetto in XCode e probabilmente non è la versione che desideri (anche se potrei sbagliarmi). – Eimantas

+0

Se si imposta il valore CFBundleVersion nel file plist su $ {CURRENT_PROJECT_VERSION}, verrà sostituito con quello che è nella versione corrente del progetto dalle impostazioni di costruzione. È quindi possibile utilizzare agvtool bump per incrementare il numero di build. – mjk

+2

Inoltre, è possibile utilizzare 'CFString'' kCFBundleVersionKey' al posto della stringa hardhared '@" CFBundleVersion "', castato in 'NSString' se necessario come richiesto nel codice sopra. – trss

12

Guardate nel file Info.plist che dovrebbe avere tasti come CFBundleVersion e CFBundleShortVersionString

+6

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

+0

ghommey - c'è una guida per la lista programmazione su developer.apple.com. Sono sicuro che ora puoi scoprirlo da solo,) – Eimantas

7

Tali elementi nelle informazioni di creazione non sono disponibili per l'app creata. Sono segnaposto che potresti inserire nella tua app. Ciò che è nella tua app è qualsiasi cosa tu inserisca, ad esempio, nella cartella Risorse della tua app, come qualsiasi file di testo o plists, o una bella immagine del tuo ingegnere delle versioni.

Ora, è possibile inserire alcuni elementi nella finestra Informazioni build in un file info.plist, utilizzando identificatori speciali, come $ {VERSION_INFO_PREFIX} o altro token. I token sono disponibili se fai clic su uno degli elementi sul lato sinistro della finestra che hai incluso sopra. Ad esempio, fai clic sulla parola "Versione progetto corrente" e copia il token che vedi in basso, "CURRENT_PROJECT_VERSION". Quindi vai al tuo file Plist e aggiungi una voce. Dagli qualsiasi nome tu voglia o "Versione attuale del progetto". Incolla in $ {CURRENT_PROJECT_VERSION} sul lato destro. Ora quel valore è disponibile per te dalla tua app, a livello di programmazione. Ovviamente, qualcuno deve inserire quel valore nel posto appropriato nella finestra Informazioni build o altrove. Potrebbe essere più semplice gestire questo e campi come questo nel file info.plist. Dipende da te come ti piacerebbe gestire queste cose.

Ecco come ottenere informazioni sulla versione dal mio 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

"Undefined o valore immondizia restituito al chiamante"! Elimina versText e inserisci un'istruzione return sulla sua posizione. Alla fine ritorna nil. – testing

+1

Non 'NSLog' come questo. Dovrebbe essere 'NSLog (@"% @ ", versText);'. Se 'versText' rimane indefinito, il che è possibile dal codice, questo si tradurrà in un crash. – Mundi

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

mi restituisce sempre lo stesso valore (versione iniziale), anche se cambio la versione dalle impostazioni del progetto, ma.

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

fa il trucco.

+0

CFBundleVersion - un codice assembly. Non una stringa di versione. – ETech

1

Per i più pigri qui è la versione rapida:

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

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

Problemi correlati