Як мій додаток iphone може виявити власний номер версії?


254

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

Я б не мав цього робити вручну з кожною версією, яку випускаю ...

Чи є спосіб у target-C дізнатися, яка версія мого додатка?


1
На це питання вже відповіли тут stackoverflow.com/a/16888788/2890157 .
Акшат Сінгал

1
.. пов'язане запитання стає через 4 роки, тому справжнє питання полягає в тому, що cmos ніколи не приймав відповіді. Незважаючи на це, відповіді на відповідні запитання корисні, як і відповіді тут. В обох нитках дивіться понад першу відповідь - іноді є більш свіжа інформація про більш пізню відповідь.
ToolmakerSteve

Відповіді:


222

Як я тут описую , я використовую скрипт, щоб переписати файл заголовка з моїм поточним номером редакції Subversion. Цей номер редакції зберігається в константі kRevisionNumber. Потім я можу отримати доступ до версії та номеру версії, використовуючи щось подібне до наступного:

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

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


152
Це повернуло мою версію збірки, тому я використав цю. [[[NSBundle mainBundle] infoDictionary] objectForKey: @ "CFBundleShortVersionString"]
jspooner

6
CFBundleVersion є невірним, оскільки Xcode помилково заповнює цей запис у списку номером збірки, а не номером версії. jspooner правильний.
Оскар

4
Дивіться stackoverflow.com/questions/6851660/version-vs-build-in-xcode-4 для великого пояснення номерів версії та збірки. Підтверджує, CFBundleShortVersionStringщо зазвичай потрібно для "версії" та CFBundleVersionдля номера збірки.
Рорі

3
kRevisionNumber, здається, не працює для мене. Щоб отримати вказаний вихід, я зробив це (використовуючи виправлення @jspooner):[NSString stringWithFormat:@"Version: %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"], [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]]
Адам,

147

Спираючись на відповідь Бреда Ларсона, якщо у вас є інформація про основні та другорядні версії, що зберігаються в інформаційному списку (як я це робив у конкретному проекті), це добре працювало для мене:

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

Тепер перегляд незначної версії вручну може бути болем, і тому використання хитрості витівки з номером ревізії джерела є ідеальним. Якщо ви цього не зробили (як я цього не зробив), описаний вище фрагмент може бути корисним. Це також виводить відображуване ім’я програми.


59

Швидка версія для обох окремо:

Швидкий 3

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

Швидкий 2

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

Його включено до цього репо, перевірте:

https://github.com/goktugyil/EZSwiftExtensions


42

Це я зробив у своїй заяві

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

Сподіваємось, ця проста відповідь комусь допоможе ...


1
Для моїх потреб це чудово. Дякую. +1
Девід ДельМонте

1
Це повертає назву збірки, а не версію
chancyWu

@chancyWu, здається, CFBundleShortVersionString надає версію.
Brian F Leighty


30

Є дві речі - версія версії та версія додатка.

  1. Щоб отримати версію програми:

    NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
  2. Щоб отримати версію Build:

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

Чи є різниця між цими двома? Вони обидва повертають однаково для мене.
jjnevis

так, може бути, ваш номер збірки та версія програми однакові в налаштуваннях.
Шейк Ріяз

Гаразд, у мене лише один параметр у моєму RAKEFILE - app.version (я використовую RubyMotion). Я думаю, що або зробить для моїх потреб. Спасибі
jjnevis

Дякую, друже. Працювали плавно.
Феліпе

1
FYI Краще використовувати objectForInfoDictionaryKey:замість того, infoDictionary] objectForKey:що колишній повертає локалізоване значення (якщо воно є). Напевно, тут нічого не зміниться;)
deanWombourne

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

1
Саме те, що мені було потрібно!
Юлій

16

Короткий спосіб отримати рядок версії у форматі XYZ :

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

Або лише для XY:

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

Обидва ці фрагменти повертають рядки, які ви б призначили властивості тексту вашого об’єкта мітки, наприклад

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

7

Ви можете спробувати використовувати словник як: -

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

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

4

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


4

Ви можете скористатись інформаційним словником, який отримує детальну інформацію про версію з інформаційного списку програми. Цей код працює для швидкого 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)"
}

3

Швидкий 5:

Є дві речі - версія додатка та версія збірки

  • Щоб отримати версію програми:

     if let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
          // present appVersion
    }
  • Щоб отримати версію Build:

     if let buildVersion = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
          // present buildVersion
     }

Спасибі @Brad Larson♦велике


1

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

Я сподіваюся, що це допомагає!


1
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.


0

Це добре, щоб впоратися із системою контролю ревізії. Таким чином, коли ви отримуєте звіт про помилку від користувача, ви можете перевірити, чи є перегляд коду, і (сподіваємось) відтворити помилку з таким самим кодом, що і користувач.

Ідея полягає в тому, що кожного разу, коли ви будуєте збірку, ви запускаєте сценарій, який отримує поточний номер версії вашого коду та оновлює файл у вашому проекті (як правило, з певною формою заміни лексеми). Потім ви можете написати процедуру обробки помилок, яка завжди включає номер виправлення у висновку про помилку, або ви можете відобразити її на сторінці "Про".


0

Ви можете спробувати цей метод:

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.