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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

Быстрая версия для обоих:

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

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

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

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

Ответ 7

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

Ответ 8

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

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

Или, просто для X.Y:

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

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

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

Ответ 9

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

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

NSString *buildVersion = infoDictionary[(NSString*)kCFBundleVersionKey];
NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey]

Ответ 10

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

Ответ 11

Вы можете использовать infoDictionary, который получает информацию о версии из info.plist вашего приложения. Этот код работает для быстрого 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)"
}

Ответ 12

Если вам нужна комбинация как , так и build 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.

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

Ответ 13

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

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

Ответ 14

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

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];

Ответ 15

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.