24

这可能不仅限于iOS 通用框架,而是所有 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

4 回答 4

24

这是一个适用于通用框架的解决方案。只需用SomeFrameworkClass所需框架中的类替换即可。

if let sdkVersion = Bundle(for: SomeFrameworkClass.self).infoDictionary?["CFBundleShortVersionString"] {
    // sdkVersion is available here
}
于 2017-03-23T16:46:35.210 回答
21

我发现 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[];
于 2014-10-13T12:25:44.700 回答
6

假设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 iOS/MacOS 框架中是否有为 CFBundleShortVersionString 定义的常量

于 2016-09-09T13:25:59.047 回答
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; }
于 2019-01-13T00:40:10.953 回答