2009-09-29 2 views
18

Я хотел бы добавить текущую версию в раздел «about» моего приложения. Как видно из прилагаемого скриншота, Apple предлагает управление версиями.Как отобразить текущую версию моего приложения для пользователя?

Как вы показываете эти настройки в своем приложении?

Screenshot of Target 'myApp' Info http://i35.tinypic.com/30c7ith.jpg

ответ

24

После дальнейшего поиска и тестирования, я нашел решение сам.

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

Этот snipplet дал мне следующий вывод:

20 Ключи: NSBundleResolvedPath, CFBundleVersion, NSBundleInitialPath, CFBundleIdentifier, NSMainNibFile, CFBundleIconFile, CFBundleInfoPlistURL, CFBundleExecutable, DTSDKName, UIStatusBarStyle, CFBundleDevelopmentRegion, DTPlatformName, CFBundleInfoDictionaryVersion, CFBundleSupportedPlatforms, CFBundleExecutablePath, CFBundleDisplayName, LSRequiresIPhoneOS, CFBundlePackageType, CFBundleSignature, CFBundleName

Таким образом, решение так просто, как:

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

Однако это не текущего проекта Version, как показано на скриншоте, но Bundle версии файла Plist.

+1

Я думаю, что тогда управление версиями включает в себя добавление репозиториев и настройку SCM для вашего проекта в XCode, и это, вероятно, не версия, которую вы хотите (хотя я могу ошибаться). – Eimantas

+0

Если вы установите значение CFBundleVersion в вашем файле plist в значение $ {CURRENT_PROJECT_VERSION}, оно будет заменено на то, что находится в текущей версии проекта из настроек сборки. Затем вы можете использовать agvtool bump для увеличения номера сборки. – mjk

+2

Кроме того, вместо строки hardcoded '@" CFBundleVersion "', которая используется в 'NSString', может быть использована' CFString' 'kCFBundleVersionKey', если это необходимо, в коде выше. – trss

12

Посмотрите в файл Info.plist который должен иметь ключи как CFBundleVersion и CFBundleShortVersionString

+6

Подробнее: http://developer.apple.com/mac/library/documentation/MacOSX/Conceptual/BPRuntimeConfig/ Статьи/PListKeys.html # // apple_ref/doc/uid/20001431-102364 http://www.dribin.org/dave/blog/archives/2006/08/02/versioning_os_x_apps/ – 2009-09-29 13:00:47

+0

ghommey - есть руководство для списка программирование на developer.apple.com. Я уверен, что вы можете это выяснить самостоятельно) – Eimantas

7

Эти элементы в информации о сборке недоступны для вашего встроенного приложения. Они являются заполнителями, которые вы могли бы использовать в своем приложении. Что в вашем приложении есть все, что вы размещаете, скажем, в папке «Ресурсы» вашего приложения, например, в любых текстовых файлах или листах, или в хорошем изображении вашего инженера по разработке версий.

Теперь вы можете вытащить некоторые элементы в окне информации о сборке в info.plist, используя специальные идентификаторы, такие как $ {VERSION_INFO_PREFIX} или другой токен. Токены доступны, если вы нажмете на любой из предметов с левой стороны в окне, которое вы указали выше. Например, щелкните по слову «Текущая версия проекта» и скопируйте токен, который вы видите внизу, «CURRENT_PROJECT_VERSION». Затем перейдите в свой файл plist и добавьте запись. Дайте ему любое имя, которое вы хотите, или «Текущая версия проекта». Вставьте в $ {CURRENT_PROJECT_VERSION} с правой стороны. Теперь это значение доступно вам из вашего приложения, программно. Конечно, кто-то теперь должен ввести эту ценность в соответствующее место либо в окне «Информация о сборке», либо в другом месте. Просто проще просто управлять этим и такими полями в файле info.plist. Это зависит от вас, как вы хотели бы справиться с этими вещами.

Вот как я получаю информацию о версии из моего 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

«Неопределенная или стоимость мусора возвращается абоненту»! Удалите versText и поставьте оператор return на его позицию. В конце верните нуль. – testing

+1

Не 'NSLog', как это. Это должно быть 'NSLog (@"% @ ", versText);'. Если 'versText' остается неопределенным, что возможно из кода, это приведет к сбою. – Mundi

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

возвращает меня всегда то же значение (первоначальный вариант), даже если я изменить версию от настроек проекта, но.

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

делает трюк.

+0

CFBundleVersion - код сборки. Не строка версии. – ETech

1

Для ленивых здесь быстрая версия:

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

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

Смежные вопросы