Получить номер версии 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; }
Другие вопросы по тегам