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

127

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

jcardenete
источник
См. Также stackoverflow.com/questions/7608632/…
Алекс Ноласко

Ответы:

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
e1985
источник
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]; 
Anupdas
источник
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];

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

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

neowinston
источник
3

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

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

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

https://github.com/goktugyil/EZSwiftExtensions

Esqarrouth
источник
Вы должны дать понять, что являетесь владельцем этого репо. Вы же не хотите выдавать себя за спамера.
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"];
Вайбхав Шиледар
источник