Я пишу приложение для iPhone. Он уже опубликован, но я хотел бы добавить функцию, в которой отображается номер его версии.
Я бы предпочел не делать это вручную с каждой выпускаемой мной версией ...
Есть ли способ в objective-C узнать, какая версия моего приложения?
.. связанный вопрос задан 4 года спустя, так что настоящая проблема здесь в том, что cmos никогда не принял ответ. Тем не менее, ответы на связанный вопрос полезны, как и ответы здесь. В обоих потоках обращайте внимание не только на первый ответ - иногда более свежая информация содержится в более позднем ответе.





Это хорошая вещь, чтобы справиться с системой контроля версий. Таким образом, когда вы получаете отчет об ошибке от пользователя, вы можете проверить эту версию кода и (надеюсь) воспроизвести ошибку, запустив тот же код, что и пользователь.
Идея состоит в том, что каждый раз, когда вы выполняете сборку, вы запускаете сценарий, который получает текущий номер версии вашего кода и обновляет файл в вашем проекте (обычно с некоторой формой замены токена). Затем вы можете написать процедуру обработки ошибок, которая всегда включает номер версии в выводе ошибок, или вы можете отобразить ее на странице «О программе».
Вы можете указать строку CFBundleShortVersionString в файле plist.info и прочитать ее программно, используя предоставленный API.
Как я описываю здесь, я использую сценарий для перезаписи файла заголовка с моим текущим номером версии Subversion. Этот номер версии хранится в константе kRevisionNumber. Затем я могу получить доступ к версии и номеру ревизии, используя что-то вроде следующего:
[NSString stringWithFormat:@"Version %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"], kRevisionNumber]
который создаст строку формата «Версия 1.0 (51)».
Это вернуло мою версию сборки, поэтому я использовал эту. [[[NSBundle mainBundle] infoDictionary] objectForKey: @ "CFBundleShortVersionString"]
CFBundleVersion неверен, потому что Xcode ошибочно заполняет эту запись plist номером сборки, а не номером версии. jspooner правильный.
См. stackoverflow.com/questions/6851660/version-vs-build-in-xcod e-4 для подробного объяснения номеров версий и сборок. Подтверждает, что CFBundleShortVersionString то, что вы обычно хотите для "версии" и CFBundleVersion для номера сборки.
kRevisionNumber, похоже, не работает для меня. Чтобы получить указанный результат, я сделал это (используя исправление @jspooner): [NSString stringWithFormat:@"Version: %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"], [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]]
Прочтите файл 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
Это возвращает имя сборки, а не версию
@chancyWu, CFBundleShortVersionString, похоже, дает версию.
Вы можете попробовать использовать словарь как: -
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"];
Именно то, что мне нужно!
Есть две вещи - версия сборки и версия приложения.
Чтобы получить версию приложения:
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
Чтобы получить версию сборки:
NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
Есть ли разница между этими двумя? Они оба возвращают мне одно и то же.
да, может быть ваш номер сборки и версия приложения совпадают в настройках.
Хорошо, у меня в RAKEFILE только одна настройка - app.version (я использую RubyMotion). Думаю, для моих нужд подойдет любой вариант. Спасибо
Спасибо друг. Работает без сбоев.
К вашему сведению. Предпочтительно использовать objectForInfoDictionaryKey: вместо infoDictionary] objectForKey:, потому что первый возвращает локализованное значение (если оно есть). Вероятно, здесь не будет никакой разницы;)
Версия 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
Он включен в это репо, проверьте это:
Если вам нужен комбинация для обоих версия а также номер сборки, вот короткий способ использования 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♦
На этот вопрос уже был дан ответ здесь stackoverflow.com/a/16888788/2890157.