2009-08-21 1 views
5

Mögliche Duplizieren:
How can I display the application version revision in my application's settings bundle?iPhone Update-Anwendung Version (in den Einstellungen)

Ich habe eine iPhone-Anwendung, die die aktuelle Version als Einstellungen konstant zeigt (wie Skype tut).

Als ich die erste Version der Anwendung freigegeben wird, verwende ich diesen Code die App-Einstellungen festlegen:

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

Und das war schön und gut.

Das Problem, das ich jetzt Gesicht ist, dass, wenn Sie die Anwendung aktualisieren, diese Standardeinstellungen (Einstellungen) sind noch neu geschrieben, so dass die Anwendung Version nicht aktualisiert.

Wie kann ich erzwingen, dass bei jeder Installation eine bestimmte Einstellung vorgenommen wird?

Dank Gonso

Antwort

0

Warum würden Sie setzen nicht die Versionsnummer aus dem Main?

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

Auf diese Weise müssen Sie die Einstellungsdatei nicht für jede Version aktualisieren. Wenn Sie die vorhandene Version mit der neuen Version vergleichen möchten. Sie können beim Start die Versionsnummer in eine Datei schreiben und die Verzeichnisversion mit der Startversion vergleichen.

+0

Aber dann kann ich die Version im Einstellungsbildschirm nicht haben, kann ich?Diese ist, wie ich die Version definieren: \t \t \t \t \t Typ \t \t \t PSTitleValueSpecifier \t \t \t Titel \t \t \t Version \t \t \t Key \t \t \t application \t \t \t Default \t \t \t 1.1.2 \t \t gonso

1

Ich habe diesen Code in meiner Anwendung Delegierten -applicationDidFinishLaunching:

#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. 

Aber App hat, bevor Einstellungen 'Version' Updates ausgeführt werden soll die Änderung widerzuspiegeln.

7

Sie können folgende ‚Skript ausführen‘ Build-Phase verwenden:

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 

Alles, was Sie tun müssen, ist YourApp mit Ihrem App-Namen zu ersetzen und den entsprechenden Schlüsselpfad festgelegt.

In meinem Fall, ich habe 4 Elemente in der PreferenceSpecifiers Array, und ich brauche den Wert für das letzte Element aus dem Array zu setzen, und deshalb habe ich ‚: PreferenceSpecifiers: : Default‘

+1

falls Sie einen Platz in Ihrem App-Namen CFBundleShortVersionString = '/ usr/libexec/PlistBuddy -c "Drucken: CFBundleShortVersionString" "$ {SRCROOT}/$ {INFOPLIST_FILE}" ' CFBundleVersion = '/ usr/libexec/PlistBuddy -c" Drucken: CFBundleVersion "" $ {SRCROOT}/$ {INFOPLIST_FILE} "' /usr/libexec/PlistBuddy -c "Festlegen: PreferenceSpecifiers: 0: DefaultValue '$ {CFBundleShortVersionString } ($ {CFBundleVersion}) '"" $ {SRCROOT}/$ {PROJECT} /Settings.bundle/Root.plist " – Zsolt