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

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

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

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

На этот вопрос уже был дан ответ здесь stackoverflow.com/a/16888788/2890157.

Akshat Singhal 22.10.2013 09:28

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

ToolmakerSteve 30.01.2017 22:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
255
2
111 838
16

Ответы 16

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

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

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

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

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

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

Это вернуло мою версию сборки, поэтому я использовал эту. [[[NSBundle mainBundle] infoDictionary] objectForKey: @ "CFBundleShortVersionString"]

jspooner 19.05.2012 06:08

CFBundleVersion неверен, потому что Xcode ошибочно заполняет эту запись plist номером сборки, а не номером версии. jspooner правильный.

Oscar 31.01.2013 00:34

См. stackoverflow.com/questions/6851660/version-vs-build-in-xcod‌ e-4 для подробного объяснения номеров версий и сборок. Подтверждает, что CFBundleShortVersionString то, что вы обычно хотите для "версии" и CFBundleVersion для номера сборки.

Rory 02.02.2013 22:15

kRevisionNumber, похоже, не работает для меня. Чтобы получить указанный результат, я сделал это (используя исправление @jspooner): [NSString stringWithFormat:@"Version: %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"], [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]]

Adam 30.04.2015 21:19

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

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

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

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

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

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

Или всего за X.Y:

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

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

myLabel.text = [NSBundle mainBundle].infoDictionary[@"CFBundleVersion"];

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

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

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

Для моих нужд это отлично. Спасибо. +1

ICL1901 08.01.2014 05:37

Это возвращает имя сборки, а не версию

chancyWu 07.05.2014 08:14

@chancyWu, CFBundleShortVersionString, похоже, дает версию.

Brian F Leighty 03.08.2016 20:45

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

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

NSString *buildVersion = infoDictionary[(NSString*)kCFBundleVersionKey];
NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey]
// Syncs with App Store and Xcode Project Settings Input
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];

Именно то, что мне нужно!

Julius 18.08.2014 12:17

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

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

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

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

Есть ли разница между этими двумя? Они оба возвращают мне одно и то же.

jjnevis 19.03.2015 16:21

да, может быть ваш номер сборки и версия приложения совпадают в настройках.

Shaik Riyaz 19.03.2015 16:29

Хорошо, у меня в RAKEFILE только одна настройка - app.version (я использую RubyMotion). Думаю, для моих нужд подойдет любой вариант. Спасибо

jjnevis 19.03.2015 19:40

Спасибо друг. Работает без сбоев.

Felipe 15.04.2015 20:07

К вашему сведению. Предпочтительно использовать objectForInfoDictionaryKey: вместо infoDictionary] objectForKey:, потому что первый возвращает локализованное значение (если оно есть). Вероятно, здесь не будет никакой разницы;)

deanWombourne 15.06.2015 13:00

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

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

Если вам нужен комбинация для обоих версия а также номер сборки, вот короткий способ использования 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.

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

Вы можете использовать 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)"
}

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

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
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.

Swift 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♦

Другие вопросы по теме