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

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

7 ответов

Решение

Значение, которое вы устанавливаете в поле "Version" сводки цели Xcode, находится здесь:

Свифт 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

и "Строй":

Свифт 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

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

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

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

Когда используешь 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 bellow:", 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];

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

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

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

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

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

https://github.com/goktugyil/EZSwiftExtensions

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

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

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

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

Swift 3 получает пакетную версию и строит строки

Код

  extension UIApplication {
    class var Build: String? {
        get {
            return Bundle.main.infoDictionary?[kCFBundleVersionKey as String] as? String
        }
    }

    class var Version: String? {
        get {
            return Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String
        }
    }
}

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

print("Version \(UIApplication.Version!)")
print("Build \(UIApplication.Build!)")

Результат

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

Приставка

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

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

Другие вопросы по тегам