Версия приложения для обновления iPhone (в настройках)

Возможный дубликат:
Как я могу отобразить версию версии приложения в пакете настроек моего приложения?

У меня есть приложение для iPhone, которое отображает текущую версию как константу настроек (как и в Skype).

Когда я выпустил первую версию приложения, я использовал этот код для установки настроек приложения:

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

И это сработало отлично и шикарно.

Проблема, с которой я столкнулся сейчас, заключается в том, что если вы обновляете приложение, эти значения по умолчанию (Настройки) не переписываются, поэтому версия приложения не обновляется.

Как я могу заставить задавать определенные настройки при каждой установке?

Спасибо Гонсо


person gonso    schedule 21.08.2009    source источник


Ответы (3)


Вы можете использовать следующий этап сборки Run Script:

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

Все, что вам нужно сделать, это заменить YourApp именем вашего приложения и установить соответствующий путь для ключей.

В моем случае у меня есть 4 элемента в массиве PreferenceSpecifiers, и мне нужно установить значение для последнего элемента из массива, поэтому я использовал ': PreferenceSpecifiers: 3: DefaultValue'

person arturgrigor    schedule 27.04.2012
comment
если в имени вашего приложения есть пробел CFBundleShortVersionString = /usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" "${SRCROOT}/${INFOPLIST_FILE}" CFBundleVersion = /usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "${SRCROOT}/${INFOPLIST_FILE}" / usr / libexec / PlistBuddy -c Set: PreferenceSpecifiers: 0: DefaultValue '$ {CFBundleShortVersionString} ($ {CFBundleVersion}) ПРОЕКТ} /Settings.bundle/Root.plist - person Zsolt; 14.05.2013

У меня есть этот код в делегате моего приложения -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.

Но приложение должно быть запущено до обновления версии настроек, чтобы отразить изменение.

person westsider    schedule 13.11.2010

Почему бы вам не установить номер версии из mainBundle?

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

Таким образом, вам не нужно обновлять файл настроек для каждой версии. Если вы хотите сравнить существующую и новую установленную версию. Вы можете записать номер версии в файл при запуске и сравнить версию каталога с версией запуска.

person Jordan    schedule 21.08.2009
comment
Но тогда у меня не может быть версия на экране настроек, можно? Вот как я определяю версию: ‹dict› ‹key› Тип ‹/key› ‹string› PSTitleValueSpecifier ‹/string› ‹key› Название ‹/key› ‹string› Версия ‹/string› ‹key› Key ‹/ key ›‹String› applicationVersion ‹/string› ‹key› DefaultValue ‹/key› ‹string› 1.1.2 ‹/string› ‹/dict› - person gonso; 24.08.2009