Получить номер версии iOS Universal Framework в клиенте
Скорее всего, это не только iOS Universal Frameworks, но и все файлы xxx.framework. Однако я не могу найти документацию о том, как получить текущую версию и построить фреймворк в клиентском приложении. В приложении вы бы использовали что-то вроде:
NSString *name = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"];
NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
Это даст вам текущую информацию, хранящуюся в Info.plist для приложения. Но как мы можем найти эту информацию для основы. А в моем случае конкретно встроенный фреймворк.
3 ответа
Я обнаружил, что новые платформы Apple Cocoa Touch, поддерживаемые в Xcode 6, предлагают простой ответ на эту проблему. В заголовочном файле по умолчанию, созданном для вас, что-то вроде Framework.h
, вы увидите две константы, объявленные для вас. Позднее они определяются, предположительно, во время выполнения с помощью логики внутренней структуры. Но я подтвердил, что они извлечены из списка для рамок.
//! Project version number for LocalSearch.
FOUNDATION_EXPORT double FrameworkVersionNumber;
//! Project version string for LocalSearch.
FOUNDATION_EXPORT const unsigned char FrameworkVersionString[];
Вот решение, которое работает с Universal Frameworks. Просто замени SomeFrameworkClass
с классом из желаемых рамок.
if let sdkVersion = Bundle(for: SomeFrameworkClass.self).infoDictionary?["CFBundleShortVersionString"] {
// sdkVersion is available here
}
Скажем Foo
это класс из данной структуры, вы можете использовать что-то вроде:
NSDictionary *infoDictionary = [[NSBundle bundleForClass: [Foo class]] infoDictionary];
NSString *name = [infoDictionary valueForKey:(__bridge NSString*)kCFBundleNameKey];
NSString *version = [infoDictionary valueForKey:(__bridge NSString*)kCFBundleVersionKey];
NSLog(@"%@ version %@", name, version);
В Свифте:
let foo:Foo = // ... any instance ...
if let infos = Bundle(for: type(of: foo)).infoDictionary,
let name = infos[kCFBundleNameKey as String],
let version = infos[kCFBundleVersionKey as String] {
print("Using \(name) version \(version)")
}
Это для тех, кто хочет иметь функцию в вашей среде, которая возвращает или печатает на консоли ее версию с номером сборки. Просто убедитесь, что вы используете класс, которым вы делитесь, в своем Framework.h при объявлении * infoDictionary. В моем примере я использую класс с именем cloud
+(NSString *)frameWorkVersion {
NSDictionary *infoDictionary = [[NSBundle bundleForClass: [cloud class]] infoDictionary];
NSString *version = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
NSString *build = [infoDictionary objectForKey:(NSString *)kCFBundleVersionKey];
NSString *fVersion = [NSString stringWithFormat:@"%@.%@",version,build];
NSLog(@"Framework Version %@",fVersion);
return fVersion; }