Відповіді:
Ви можете отримати версію та створити номери наступним чином:
let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let build = Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as! String
або в Objective-C
NSString * version = [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleShortVersionString"];
NSString * build = [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *)kCFBundleVersionKey];
У мене є такі методи в категорії UIApplication
:
extension UIApplication {
static var appVersion: String {
return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
}
static var appBuild: String {
return Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as! String
}
static var versionBuild: String {
let version = appVersion, build = appBuild
return version == build ? "v\(version)" : "v\(version)(\(build))"
}
}
Суть: https://gist.github.com/ashleymills/6ec9fce6d7ec2a11af9b
Ось еквівалент у Objective-C:
+ (NSString *) appVersion
{
return [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleShortVersionString"];
}
+ (NSString *) build
{
return [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *)kCFBundleVersionKey];
}
+ (NSString *) versionBuild
{
NSString * version = [self appVersion];
NSString * build = [self build];
NSString * versionBuild = [NSString stringWithFormat: @"v%@", version];
if (![version isEqualToString: build]) {
versionBuild = [NSString stringWithFormat: @"%@(%@)", versionBuild, build];
}
return versionBuild;
}
Суть: https://gist.github.com/ashleymills/c37efb46c9dbef73d5dd
(NSString *)kCFBundleVersionKey
скоріше використовувати @"CFBundleVersion"
. Навіть незважаючи на те, що вводити його довше (автоматичне завершення допоможе тут), оскільки це константа, що перевіряється під час компіляції.
NSBundle
замість UIApplication
цього, що також дозволить замінити статичні виклики на екземпляри.
UIApplication
, оскільки повернута інформація стосується програми. Також це стосується лише main
пакета - не було б сенсу робити цей метод примірника на будь-якому пакеті.
build
коли говорили appBundle
(у другому рядку коду)?
В Цілі C:
1) Щоб отримати версію програми, ви повинні використовувати:
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
2) Для отримання версії Build ви повинні використовувати:
NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
У Swift ви можете отримати версію пакета, використовуючи:
let info:NSDictionary = NSBundle.mainBundle().infoDictionary!
let version:String = info.objectForKey("CFBundleShortVersionString") as! String
versionLabel.text = "Version:" + version
Мій проект з відкритим кодом, моє оновлення додатків , пропонує цю функціональність (та більше) у вигляді методів класу:
+ (NSString *)getShortVersionString
+ (NSString *)getLongVersionString
Ви б використовували його так:
#import "AppUpdateTracker.h"
NSLog(@"short version: %@", [AppUpdateTracker getShortVersionString]);
NSLog(@"long version: %@", [AppUpdateTracker getLongVersionString]);
Просто на замітку
Для отримання локалізованого значення будь-якого ключа, який ви повинні використовувати CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), "CFBundleShortVersionString" as CFString)
Отже, версія Swift для обох цих програм окремо:
let versionNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
let buildNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String
Його включено до цього репо, перевірте: