Получить номер версии 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 для приложения. Но как мы находим эту информацию для фреймворка. И в моем случае, в частности, встроенная инфраструктура.

Ответ 1

Я обнаружил, что новые функциональные возможности Apple Cocoa Touch, поддерживаемые в Xcode 6, предлагают легкий ответ на эту проблему. В файле заголовка по умолчанию, созданном для вас, что-то вроде Framework.h, вы увидите две константы, объявленные для вас. Они определены позже, по-видимому, во время выполнения внутренней логикой структуры. Но я подтвердил, что они вытащили из plist для рамки.

//! Project version number for LocalSearch.
FOUNDATION_EXPORT double FrameworkVersionNumber;

//! Project version string for LocalSearch.
FOUNDATION_EXPORT const unsigned char FrameworkVersionString[];

Ответ 2

Вот решение, которое работает с Universal Framework. Просто замените SomeFrameworkClass на класс из нужной структуры.

if let sdkVersion = Bundle(for: SomeFrameworkClass.self).infoDictionary?["CFBundleShortVersionString"] {
    // sdkVersion is available here
}

Ответ 3

Допустим, 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);

В Свифте:

// 'Foo' is a type defined in the framework
if  let infos = Bundle(for: Foo.self).infoDictionary,
    let name = infos[kCFBundleNameKey as String],
    let version = infos[kCFBundleVersionKey as String] {     
        print("Using \(name) version \(version)")

        if let shortVersion = infos["CFBundleShortVersionString"] as? String {
            print("Short version : " + shortVersion)
        }
    }

Примечание. По какой-то причине "CFBundleShortVersionString" не определен в константе, см. Есть ли константа, определенная для CFBundleShortVersionString в платформе iOS/MacOS

Ответ 4

Это для тех, кто может захотеть иметь функцию в вашей среде, которая возвращает или печатает на консоли версию с номером сборки. Просто убедитесь, что вы используете класс, которым вы делитесь, в своем 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; }