获取客户端中iOS Universal Framework的版本号

时间:2014-07-02 18:14:04

标签: ios cocoa-touch frameworks 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中的当前信息。但是我们如何找到框架的信息。就我而言,特别是嵌入式框架。

4 个答案:

答案 0 :(得分:19)

我发现Xcode 6支持Apple的新Cocoa Touch框架,可以轻松解决这个问题。在为您创建的默认头文件中,如Framework.h之类的内容,您将看到为您声明的两个常量。这些后来可能在运行时由内部框架逻辑定义。但是我已经确认他们已经退出了该框架的plist。

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

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

答案 1 :(得分:10)

这是一个与Universal Frameworks配合使用的解决方案。只需将SomeFrameworkClass替换为所需框架中的类。

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

答案 2 :(得分: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”未在常量中定义,cf Is there a constant defined for CFBundleShortVersionString in iOS/MacOS framework

答案 3 :(得分:0)

这是为那些可能希望在您的框架上具有某个功能的人提供的,该功能可以返回或在带有版本号的版本的控制台上打印。声明 * infoDictionary 时,只需确保使用在 Framework.h 上共享的类即可。在我的示例中,我使用的是名为 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; }