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

254

Я пишу приложение для iPhone. Он уже опубликован, но я хотел бы добавить функцию, в которой отображается номер его версии.

Я бы предпочел не делать это вручную с каждой версией, которую я выпускаю ...

Есть ли способ в target-C узнать, какая версия моего приложения?

Брэд Ларсон
источник
1
На этот вопрос уже ответили здесь stackoverflow.com/a/16888788/2890157 .
Акшат Сингхал
1
.. связанный вопрос - 4 года спустя, поэтому реальная проблема заключается в том, что cmos никогда не принимал ответ. Несмотря на это, ответы на связанные вопросы полезны, как и ответы здесь. В обеих темах не ограничивайтесь первым ответом - иногда в последующем ответе содержится более актуальная информация.
ToolmakerSteve

Ответы:

222

Как я здесь описываю , я использую скрипт для перезаписи файла заголовка с моим текущим номером ревизии Subversion. Этот номер редакции сохраняется в константе kRevisionNumber. Затем я могу получить доступ к версии и номеру ревизии, используя что-то похожее на следующее:

[NSString stringWithFormat:@"Version %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"], kRevisionNumber]

который создаст строку в формате «Версия 1.0 (51)».

Брэд Ларсон
источник
152
Это вернуло мою версию сборки, поэтому я использовал эту. [[[NSBundle mainBundle] infoDictionary] objectForKey: @ "CFBundleShortVersionString"]
jspooner
6
CFBundleVersion является неправильным, потому что XCode ошибочно заполняет ту запись plist номером сборки, а не номером версии. jspooner правильный.
Оскар
4
См. Stackoverflow.com/questions/6851660/version-vs-build-in-xcode-4 для лучшего объяснения номеров версии против сборки. Подтверждает, CFBundleShortVersionStringчто вы обычно хотели бы для «версии» и CFBundleVersionдля номера сборки.
Рори
3
kRevisionNumber, похоже, не работает для меня. Чтобы получить указанный вывод, я сделал это (используя исправление @jspooner):[NSString stringWithFormat:@"Version: %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"], [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]]
Адам
147

Основываясь на ответе Брэда Ларсона, если у вас есть информация о основной и вспомогательной версиях, хранящаяся в информационном списке (как я это делал в конкретном проекте), это хорошо сработало для меня:

- (NSString *)appNameAndVersionNumberDisplayString {
    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
    NSString *appDisplayName = [infoDictionary objectForKey:@"CFBundleDisplayName"];
    NSString *majorVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
    NSString *minorVersion = [infoDictionary objectForKey:@"CFBundleVersion"];

    return [NSString stringWithFormat:@"%@, Version %@ (%@)", 
                appDisplayName, majorVersion, minorVersion];
}

Теперь изменение минорной версии вручную может быть затруднительным, поэтому использование трюка с номером ревизии исходного репозитория является идеальным. Если вы не связали это (как я не сделал), приведенный выше фрагмент может быть полезным. Это также вытаскивает отображаемое имя приложения.

idStar
источник
59

Swift версия для обоих по отдельности:

Свифт 3

let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String

Swift 2

let versionNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
let buildNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String

Это включено в этот репо, проверьте это:

https://github.com/goktugyil/EZSwiftExtensions

Esqarrouth
источник
42

Это то, что я сделал в своем приложении

NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

Надеюсь, этот простой ответ поможет кому-то ...

Аркадий
источник
1
Для моих нужд это отлично. Спасибо. +1
Дэвид ДелМонте
1
Это возвращает имя сборки, а не версию
chancyWu
@chancyWu, CFBundleShortVersionString появляется, чтобы дать версию.
Брайан Ф. Лейти
31

Вы можете указать CFBundleShortVersionStringстроку в вашем plist.info и прочитать ее программно, используя предоставленный API .

Джаспер Беккерс
источник
30

Есть две вещи - версия сборки и версия приложения.

  1. Чтобы получить версию приложения:

    NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
  2. Чтобы получить версию сборки:

    NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
Шайк Рияз
источник
Есть ли разница между этими двумя? Они оба возвращают то же самое для меня.
Йеневис
да, возможно, ваш номер сборки и версия приложения совпадают в настройках.
Шайк Рияз
Хорошо, у меня есть только один параметр в моем RAKEFILE - app.version (я использую RubyMotion). Я думаю, что либо подойдет для моих нужд. Спасибо
jjnevis
Спасибо друг. Работал без сбоев.
Фелипе
1
К вашему сведению Предпочтительно использовать objectForInfoDictionaryKey:вместо того, infoDictionary] objectForKey:потому что первый возвращает локализованное значение (если оно есть). Вероятно, здесь ничего не изменится;)
deanWombourne
17
// Syncs with App Store and Xcode Project Settings Input
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
Джон Эрк
источник
1
Именно то, что мне было нужно!
Юлиус
16

Краткий способ получить строку версии в формате XYZ :

[NSBundle mainBundle].infoDictionary[@"CFBundleVersion"]

Или просто XY:

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

Оба из этих фрагментов возвращают строки, которые вы бы присвоили текстовому свойству объекта метки, например

myLabel.text = [NSBundle mainBundle].infoDictionary[@"CFBundleVersion"];
rodamn
источник
7

Вы можете попробовать использовать словарь как: -

NSDictionary *infoDictionary = [[NSBundle mainBundle]infoDictionary];

NSString *buildVersion = infoDictionary[(NSString*)kCFBundleVersionKey];
NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey]
Абхишек Верма
источник
4

Прочитайте файл info.plist вашего приложения и получите значение для ключа CFBundleShortVersionString. Чтение info.plist даст вам объект NSDictionary

lostInTransit
источник
4

Вы можете использовать infoDictionary, который получает информацию о версии из info.plist вашего приложения. Этот код работает для Swift 3. Просто вызовите этот метод и отобразите версию в любом предпочтительном элементе пользовательского интерфейса.

Swift-3  

func getVersion() -> String {
    let dictionary = Bundle.main.infoDictionary!
    let version = dictionary["CFBundleShortVersionString"] as! String
    let build = dictionary["CFBundleVersion"] as! String
    return "v\(version).\(build)"
}
Раджат Чаухан
источник
3

Свифт 5:

Есть две вещи - версия приложения и версия сборки

  • Чтобы получить версию приложения:

     if let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
          // present appVersion
    }
  • Чтобы получить версию сборки:

     if let buildVersion = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
          // present buildVersion
     }

Спасибо @Brad Larson♦большое

dengST30
источник
1

Если вам нужно сочетание обеих версии и сборки NUM , вот короткий путь с помощью Swift 3 :

let appVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"]!
let buildNum = Bundle.main.infoDictionary!["CFBundleVersion"]!
let versionInfo = "\(appVersion) (build \(buildNum))"
// versionInfo is now something like "2.3.0 (build 17)"

Добавьте as! Stringв конец строки appVersionили или, buildNumчтобы получить только эту часть в качестве Stringобъекта. Не нужно, хотя, если вы ищете в полной мере versionInfo.

Надеюсь, это поможет!

Jeehut
источник
1
func getAppVersion() -> String {
    let dictionary = Bundle.main.infoDictionary!
    let versionValue = dictionary["CFBundleShortVersionString"] ?? "0"
    let buildValue = dictionary["CFBundleVersion"] ?? "0"
    return "\(versionValue) (build \(buildValue))"
}

Основано на ответе @rajat chauhan без принудительного приведения String.

apex39
источник
0

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

Идея состоит в том, что каждый раз, когда вы делаете сборку, вы запускаете скрипт, который получает текущий номер ревизии вашего кода и обновляет файл в вашем проекте (обычно с какой-либо формой замены токена). Затем вы можете написать подпрограмму обработки ошибок, которая всегда включает номер редакции в вывод ошибок, или вы можете отобразить его на странице «О программе».

RedFilter
источник
0

Вы можете попробовать этот метод:

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
BatyrCan
источник