在客户端获取iOS通用框架的版本号

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中的应用程序信息。但是我们如何找到框架的信息。在我的情况下,特别是一个嵌入式框架。


你成功完成了吗? - Ravi
不好意思,我想不行。但是,我们正在从iOS通用框架转移到本地Xcode 6 Cocoa Touch框架,也许我们在那里会有更好的运气。如果我弄清楚了,我会在这里更新。 - Ryan Poolos
感谢确认。 - Ravi
3
如果这是您的嵌入式框架,您可以提供一些方法或属性,使客户端能够访问到以下内容:[[[NSBundle bundleForClass:[MyFrameworkClass class]] infoDictionary] objectForKey:@"CFBundleShortVersionString"]; - cohen72
这是我获取框架包的方法 - NSBundle *rampBundle = [NSBundle bundleWithIdentifier:@"com.example.framework"]; - nswamy
4个回答

26

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

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

21

我发现苹果在Xcode 6中支持的新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[];

我不会将此标记为接受的答案,因为大多数访问此页面的人将寻求iOS通用框架的答案,但随着时间的推移,大多数人将对新的Cocoa Touch框架感兴趣,这里有一个适用于他们的答案。 - Ryan Poolos
5
我正在尝试这个,但是尽管我的框架的 info.plist 文件中为 CFBundleVersion 和 CFBundleShortVersionString 都设置了 3.3,但当我 NSLog “FrameworkVersionNumber” 或 “FrameworkVersionString” 时,我得到的是“1”。在框架的 plist 文件中,这些常量确切地从哪里获取它们的值? - cohen72
10
据我所知,这些常量并没有从 plist 文件中提取版本号。相反,您可以通过在项目的“构建设置”中更新“版本控制”下的“当前项目版本”字段来设置版本号。默认情况下,“版本控制系统”设置为 Apple Generic,这就是这两个常量如何更新的。然而,字符串版本并不仅返回版本号,还包括项目和目标的名称。我不知道您怎样才能去掉它。 - OutOfBoundsException
2
有人知道为什么在Swift中,只有var FrameworkVersionNumber: Double在模块中生成,但是没有为FrameworkVersionString[]生成变量吗? - Jonathan Ellis
不确定为什么,但使用一些基本的字符串格式化应该很容易使其呈现出漂亮的样式,对吧? - Ryan Poolos
4
很抱歉, FrameworkVersionNumber 是一个双精度浮点数,因此仅支持单个小数。例如,设置版本为 3.2.1 将导致其变为双精度值 "3.2000000"。我需要做的是提取确切的版本号组件,我相信可以使用 FrameworkVersionString[] 来完成(如果它在 Swift 中得到了公开)。鉴于这有点不相关,我现在已经将其发布为一个单独的问题,链接在这里:https://dev59.com/c10Z5IYBdhLWcg3wdQPT - Jonathan Ellis

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

在Swift中:

// `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”没有以常量的形式定义,参见iOS/MacOS框架中是否有为CFBundleShortVersionString定义的常量

NSString 前面加上 __bridge 是必要的吗? - gabbler
@gabbler 我认为我们需要使用__bridge,因为该值是CFString @NikolayDimitrov Foo应该是您想要获取信息的框架中的类型,您还可以尝试使用键“CFBundleShortVersionString”获取该值(该键未在常量cf中定义https://stackoverflow.com/questions/32187359/is-there-a-constant-defined-for-cfbundleshortversionstring-in-ios-macos-framewor) - Axel Guilmin

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; }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接