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

这可能不限于iOS通用框架,而是所有xxx.framework文件。 不过,我似乎无法find如何在客户端应用程序中获取当前版本和构build框架的文档。 在一个应用程序中,你会使用类似于:

NSString *name = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"]; NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]; 

这会给你的信息存储在Info.plist中的应用程序。 但是,我们如何find一个框架的信息。 在我的情况下,特别是一个embedded式框架。

我发现苹果公司在Xcode 6中支持的新型Cocoa Touch框架为这个问题提供了一个简单的答案。 在为您创build的默认头文件(如Framework.h ,您会看到为您声明的两个常量。 这些在后面大概在内部框架逻辑运行时定义。 但是我已经证实他们是从plist中拉出来的。

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

假设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); 

在Swift中:

 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)") } 

这是一个与通用框架一起工作的解决scheme。 只需将SomeFrameworkClassreplace为所需框架中的类即可。

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