Как программно отобразить версию / номер сборки цели в приложении iOS?


135

Как я могу программно получить значение target version, как на картинке ниже?

Как видно из окна свойств цели моего проекта XCode. Я хочу отобразить это на заставке моего приложения, чтобы я знал, какую версию люди используют в настоящее время?

Ответы:


392

Есть 2 номера!

Номер маркетинговой версии для клиентов называется номером версии . Он начинается с 1.0 и подходит для основных обновлений до 2.0 , 3.0 , для небольших обновлений до 1.1 , 1.2 и для исправлений ошибок до 1.0.1 , 1.0.2 . Этот номер ориентирован на релизы и новые функции. Не нужно останавливаться на 9, 1.11.23 - это разумный номер версии.

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


Чтобы получить номер версии :

Objective-C:

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

Свифт <3.0:

let appVersionString: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String

Swift 3.0+ (протестировано с 5.0):

let appVersionString: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String

Чтобы получить номер сборки :

Objective-C:

NSString * appBuildString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];

Свифт <3.0:

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

Swift 3.0+ (тестируется до 5.0):

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

Если вы хотите оба в одном:

Сначала используйте вышеуказанные строки, а затем следующую.

Objective-C:

NSString * versionBuildString = [NSString stringWithFormat:@"Version: %@ (%@)", appVersionString, appBuildString];

Swift (проверено до 5.0):

let versionAndBuildNumber: String = "\(appVersionString) (\(buildNumber))"

Ноты:

Значения в основном пакете не всегда присутствуют, например, в приложении командной строки нет CFBundleShortVersionStringили CFBundleVersion, поэтому методы будут возвращаться, nilи он будет аварийно завершать работу, поскольку в коде он делает неправильное снижение. Но в обычных приложениях Cocoa для iOS и Mac эти значения определены и не будут удалены.

Это проверено с версией 7.3 Xcode (7D175) . Номер сборки часто пишется в скобках / скобках. Номер сборки в шестнадцатеричном или десятичном виде.

buildandversion


В Xcode вы можете автоматически увеличивать номер сборки в виде десятичного числа , помещая следующее в Run scriptфазу сборки в настройках проекта

#!/bin/bash    
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

Для шестнадцатеричного номера сборки используйте этот скрипт

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$((0x$buildNumber)) 
buildNumber=$(($buildNumber + 1)) 
buildNumber=$(printf "%X" $buildNumber)
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

Для Xcodeсделать следующее:

Шаг 1

шаг 1

Шаг 2

шаг 2

Шаг 3

шаг 3


4
Просто для добавления в приведенном выше примере «CFBundleVersion» - это Build = 300, «CFBundleShortVersionString» - это версия = 0,41. Ответ Виктора должен быть правильным.
Джастинко

1
У меня были проблемы с шестнадцатеричными числами один раз. Apple заявляет об использовании целых чисел: developer.apple.com/library/ios/documentation/general/Reference/…
hashier

Знаете ли вы, есть ли строковые константы для @ "CFBundleShortVersionString" и @ "CFBundleVersion"?
igrek

Теперь, когда системы CI / CD довольно распространены, вы можете указать на подводные камни при использовании сценариев сборки для установки версий # с ними.
Сэм Баллантайн

1
Вещи были переименованы в Swift 3.0: Bundle.main.object(forInfoDictionaryKey: "...")сейчас.
Рафаэль

13

Вам не нужно ничего менять в вашем проекте или Xcode. Вот версия Swift для обоих по отдельности:

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

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

https://github.com/goktugyil/EZSwiftExtensions


какой ответ? я не вижу этого
Esqarrouth

Там только один ответ, он во втором абзаце
Даниэль Галаско

3
Да, 1. В его ответе слишком много шума и мало сигнала. 2. Это быстро, то есть цель-с. 3. То из эпохи ios5
Esqarrouth

Вещи были переименованы в Swift 3.0: Bundle.main.object(forInfoDictionaryKey: "...")сейчас.
Рафаэль

5

Вот тот же код для Swift 3 :

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

Bundle.mainбыл пустой infoDictionaryдля меня; может потому, что я делаю это изнутри фреймворка, а не из исполняемого файла или приложения? Bundle(for: MyClass.self)содержит ожидаемые значения.
Рафаэль

4

Программно отобразить версию и номер сборки - Swift 4.0

let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"

let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"            

let versionAndBuildNumber = "Ver #\(versionNumber) ( Build #\(buildNumber) )"

1

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

var appVersion: String {
  //versionNumber
  let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"

  //buildNumber
  let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"

  return "Version: #\(versionNumber) (#\(buildNumber))"
}

Тогда вы можете использовать где угодно, когда вы объявляете глобально.

print(appVersion)

Вывод:

Version: #1.0 (#1.0.3)

1

Я сделал расширение для Bundle, чтобы им было легко пользоваться

extension Bundle {
    var releaseVersionNumber: String? {
        return infoDictionary?["CFBundleShortVersionString"] as? String
    }

    var buildVersionNumber: String? {
        return infoDictionary?["CFBundleVersion"] as? String
    }

    var applicationName: String {
        return infoDictionary?["CFBundleDisplayName"] as? String ?? "ADKATech"
    }

    var applicationReleaseDate: String {
        return infoDictionary?["ApplicationReleaseDate"] as? String ?? Date().description
    }

    var applicationReleaseNumber: Int {
        return infoDictionary?["ApplicationReleaseNumber"] as? Int ?? 0
    }

    var releaseVersionNumberPretty: String {
        return "\(releaseVersionNumber ?? "1.0.0")"
    }

    var buildVersionNumberPretty: String {
        return "\(buildVersionNumber ?? "1")"
    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.