2009-08-21 14 views
5

Eventuali duplicati:
How can I display the application version revision in my application's settings bundle?iPhone versione dell'applicazione di aggiornamento (in Impostazioni)

Ho un'applicazione per iPhone che consente di visualizzare la versione corrente come impostazioni costante (proprio come Skype fa).

Quando ho rilasciato la prima versione dell'applicazione, io uso questo codice per impostare le impostazioni dell'applicazione:

- (void)registerDefaultsFromSettingsBundle { 
    NSString *settingsBundle = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"]; 
    if(!settingsBundle) { 
     NSLog(@"Could not find Settings.bundle"); 
     return; 
    } 

    NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:@"Root.plist"]]; 
    NSArray *preferences = [settings objectForKey:@"PreferenceSpecifiers"]; 

    NSMutableDictionary *defaultsToRegister = [[NSMutableDictionary alloc] initWithCapacity:[preferences count]]; 
    for(NSDictionary *prefSpecification in preferences) { 
     NSString *key = [prefSpecification objectForKey:@"Key"]; 
     if(key) { 
      [defaultsToRegister setObject:[prefSpecification objectForKey:@"DefaultValue"] forKey:key]; 

     } 
    } 

    [[NSUserDefaults standardUserDefaults] registerDefaults:defaultsToRegister]; 
    [defaultsToRegister release]; 
} 

E questo ha funzionato bene e dandy.

Il problema che devo affrontare ora è che se si aggiorna l'applicazione, questi valori predefiniti (Impostazioni) non vengono né riscritti, quindi la versione dell'applicazione non viene aggiornata.

Come posso forzare l'impostazione di una specifica impostazione su ogni installazione?

Grazie Gonso

risposta

0

perché non si impostare il numero di versione dal mainBundle?

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

In questo modo non è necessario aggiornare il file delle impostazioni per ogni versione. Se si desidera confrontare la versione esistente rispetto alla nuova versione di installazione. È possibile scrivere il numero di versione su un file all'avvio e confrontare la versione della directory con la versione di avvio.

+0

Ma quindi non posso avere la versione nella schermata Impostazioni, posso? questo è come mi definisco la Versione: \t \t \t \t \t Tipo \t \t \t PSTitleValueSpecifier \t \t \t Titolo \t \t \t Versione \t \t \t chiave \t \t \t VersioneApplicazione \t \t \t DefaultValue \t \t \t 1.1.2 \t \t gonso

1

ho questo codice nella -applicationDidFinishLaunching mia applicazione del delegato:

#if DDEBUG // debugging/testing 
    NSString *versionString = [NSString stringWithFormat:@"v%@",[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]]; 
#else 
    NSString *versionString = [NSString stringWithFormat:@"Version %@",[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]]; 
#endif // DDEBUG 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setValue:versionString forKey:@"version"]; 
    printf("Version: = %s\n", [versionString cStringUsingEncoding:NSMacOSRomanStringEncoding]); 
    [defaults synchronize]; // force immediate saving of defaults. 

Ma app deve essere eseguito prima 'versione' Impostazioni aggiornamenti per riflettere il cambiamento.

7

È possibile utilizzare il seguente 'Run Script' costruire Fase:

CFBundleShortVersionString=`/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" ${SRCROOT}/YourApp/YourApp-Info.plist` 
CFBundleVersion=`/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" ${SRCROOT}/YourApp/YourApp-Info.plist` 
/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:3:DefaultValue '${CFBundleShortVersionString} (${CFBundleVersion})'" ${SRCROOT}/YourApp/Settings.bundle/Root.plist 

Tutto quello che devi fare, è quello di sostituire il YourApp con il nome della tua applicazione e impostare il percorso chiave appropriata.

Nel mio caso, ho 4 elementi della serie PreferenceSpecifiers, e ho bisogno di impostare il valore per l'ultimo elemento dalla matrice e per questo ho usato ': PreferenceSpecifiers: : DefaultValue'

+1

nel caso in cui si dispone di uno spazio nel tuo nome dell'applicazione CFBundleShortVersionString = '/ usr/libexec/PlistBuddy -c "Stampa: CFBundleShortVersionString" "$ {SRCROOT}/$ {INFOPLIST_FILE}" ' CFBundleVersion = '/ usr/libexec/PlistBuddy -c" Stampa: CFBundleVersion "" $ {SRCROOT}/$ {INFOPLIST_FILE} "' /usr/libexec/PlistBuddy -c "Set: PreferenceSpecifiers: 0: DefaultValue '$ {CFBundleShortVersionString } ($ {CFBundleVersion}) '"" $ {SRCROOT}/$ {PROJECT} /Settings.bundle/Root.plist " – Zsolt

Problemi correlati