Як програмно відобразити версію / збірку кількості цілі в додатку 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 - це розумний номер версії.

Номер збірки - це переважно внутрішня кількість збірок , які були зроблені до цього часу. Але деякі використовують інші числа, наприклад, номер філії сховища або його номер комісії. Це число повинно бути унікальним для розрізнення різних складових, які мають лише незначні додаткові зміни.


Щоб отримати номер версії :

Завдання-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

Щоб отримати номер збірки :

Завдання-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   

Якщо ви хочете обидва в одному:

Спочатку скористайтеся вищевказаними рядками, а потім наступними.

Завдання-C:

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

Swift (тестується до 5,0):

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

Примітки:

Значення в основному пакеті не завжди є, наприклад, у застосуванні командного рядка немає CFBundleShortVersionStringабо CFBundleVersion, тому методи повернуться, nilі вони будуть руйнуватися, тому що в коді він робить неправильне похилення. Але в звичайних додатках для какао iOS та Mac ці значення визначені і видалятися не будуть.

Це перевірено за допомогою Xcode версії 7.3 (7D175) . Число збірки часто записується в дужки / дужки. Номер складання - у шістнадцятковій чи десятковій.

нарощування і перетворення


У 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

step3


4
Просто для додання вищенаведеного прикладу "CFBundleVersion" - це збірка = 300, "CFBundleShortVersionString" - це версія = 0,41. Відповідь Віктора повинна бути правильною.
justinkoh

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

Чи знаєте ви, чи є рядкові константи для @ "CFBundleShortVersionString" та @ "CFBundleVersion"?
ігрик

Тепер, коли системи 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


яка відповідь? я не бачу цього
Ескароут

Є лише одна відповідь, це у його другому абзаці
Даніель Галаско

3
Так, 1. Це занадто багато шуму і не так багато сигналу у його відповіді. 2. Це стрімкий, тобто об’єктивний-с. 3. Thats з епохи 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.