Приложение для iOS, программно получить версию сборки


127

Есть ли способ программно получить версию сборки моего приложения? Мне нужно иметь возможность определять, когда пользователь обновил приложение через AppStore, чтобы выполнить некоторый код для корректировок.



Ответы:


283

Значение, которое вы установили в поле «Версия» сводной информации о цели Xcode, находится здесь:

Swift 3

let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as! String

ObjC

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

Swift 2

let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as! String

и «Сборка»:

Swift 3

let build = Bundle.main.infoDictionary?[kCFBundleVersionKey as String] as? String

ObjC

NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString *)kCFBundleVersionKey];

Swift 2

let build = NSBundle.mainBundle().infoDictionary?[kCFBundleVersionKey as String] as! String

5
Использование строкового литерала, а не константы не гарантирует будущего; см. ответ Анупдаса для постоянных ключей.
Aaron Brager 03

9
Вы правы для @ "CFBundleVersion" - я отредактировал свой ответ. Однако для @ "CFBundleShortVersionString" нет константы AFAIK.
e1985

Для Свифта NSBundle.mainBundle()сейчасBundle.main
Тодд

85

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

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

NSString *version = infoDictionary[@"CFBundleShortVersionString"];
NSString *build = infoDictionary[(NSString*)kCFBundleVersionKey];
NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey]; 

13
kCFBundleVersionKey - это «сборка», а не «версия»
powerj1984

11

При использовании MFMailComposeViewControllerкнопки «Связаться с нами» я использую этот код для получения от пользователя отформатированного HTML-кода в электронном письме. Он дает мне всю информацию, которая мне нужна, чтобы помочь решить любую проблему:

struct utsname systemInfo;
uname(&systemInfo);

NSDateFormatter *formatter = [[NSDateFormatter alloc]  init];
NSDate  *date = [NSDate date];
[formatter setDateFormat:@"MM/dd/yyyy 'at' hh:mm a"];
NSString *dateString = [formatter stringFromDate:date];

CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenWidth = screenRect.size.width - 65.0;

NSString *comments = NSLocalizedString(@"Please write your comments below:", nil);
NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey];
NSString *deviceModel = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
NSString *iOSVersion = [[UIDevice currentDevice] systemVersion];

NSString *emailBody = [NSString stringWithFormat:@"<!DOCTYPE html><html><style> .div {background-color: lightgrey; width: %fpx; padding: 10px; border: 5px solid navy; margin: 2px;}</style><body><div class='div'><p><b>App:</b> %@</p><b><p>Device:</b> %@</p><b><p>iOS Version:</b> %@</p><b><p><p>App Version and Build:</b> %@ (%@)</p><b><p>Date:</b> %@</p> </p></div><font color='red'><b>%@</b></font><br><br></body></html>",screenWidth,appName,deviceModel,iOSVersion,version,build,dateString,comments];

[self setMessageBody:emailBody isHTML:YES];

Это результат при получении сообщения:

введите описание изображения здесь


3

Версия Swift для обоих отдельно:

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

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

https://github.com/goktugyil/EZSwiftExtensions


Вы должны дать понять, что являетесь владельцем этого репо. Вы же не хотите выдавать себя за спамера.
JAL

2

подробности

  • Xcode версии 10.3 (10G8), Swift 5

Решение

class Info {
    static let dictionary = Bundle.main.infoDictionary ?? [:]
    enum Value {
        case build, version
    }
}

extension Info.Value {

    var key: String {
        switch self {
            case .build: return kCFBundleVersionKey as String
            case .version: return kCFBundleInfoDictionaryVersionKey as String
        }
    }

    var string: String? { return Info.dictionary[key] as? String }
}

использование

if let value = Info.Value.version.string { print("Version: \(value)") }
if let value = Info.Value.build.string { print("Build: \(value)") }

результат

Настройки проекта

введите описание изображения здесь


1

Я написал этот проект с открытым исходным кодом именно для этой цели. Мой проект отправляет уведомления, когда происходят важные события, например, когда пользователь открывает приложение в первый раз или открывает приложение после обновления (вместе с информацией о том, с какой версии пользователь обновился). Источник прост и должен быть легким для понимания. Дайте мне знать, если у вас возникнут вопросы / пожелания.

Я также недавно написал об этом сообщение в блоге .


1

1) Для получения версии приложения необходимо использовать:

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

2) Для получения версии сборки необходимо использовать:

NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.