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

Rya*_*los 16 cocoa-touch frameworks ios 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"];
Run Code Online (Sandbox Code Playgroud)

这将为您提供存储在应用程序的Info.plist中的当前信息.但是我们如何找到框架的信息.就我而言,特别是嵌入式框架.

Rya*_*los 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[];
Run Code Online (Sandbox Code Playgroud)

  • @YoCoh正如我所知,常量不是从plist文件中提取版本号.相反,您可以通过更新项目的"Build Settings"中"Versioning"下的"Current Project Version"字段来设置您的版本.您会注意到,默认情况下,`Versioning System`设置为Apple Generic.这就是这两个常量的更新方式.但是,字符串版本不仅返回版本号,还包括项目和目标的名称.我不知道你怎么能摆脱它. (8认同)
  • 我正在尝试这个,但是尽管我的框架的info.plist为CFBundleVersion和CFBundleShortVersionString都设置了3.3,但当我NSLog的'FrameworkVersionNumber'或'FrameworkVersionString'时,我得到'1'.究竟在框架的plist中,这些常数是否会拉动它们的值? (3认同)
  • 怕不是... `FrameworkVersionNumber` 是一个double,所以它只支持一个十进制,所以例如设置一个3.2.1 的版本只是将它更改为double 值“3.2000000”。我需要能够做的是提取确切的版本号组件,我相信我可以用 `FrameworkVersionString[]` 来做(如果它只在 Swift 中公开的话)。看到这有点偏离主题,我现在将其作为一个单独的问题发布在这里:http://stackoverflow.com/questions/31418303/get-cocoa-touch-framework-project-version-string-in-swift (3认同)
  • 有谁知道为什么在 Swift 中,模块中只生成了 `var FrameworkVersionNumber: Double`,而没有为 `FrameworkVersionString[]` 生成变量吗? (2认同)

pic*_*ano 11

这是一个与Universal Frameworks一起使用的解决方案.只需用SomeFrameworkClass所需框架中的类替换即可.

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


Axe*_*min 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);
Run Code Online (Sandbox Code Playgroud)

在斯威夫特:

// `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)
        }
    }
Run Code Online (Sandbox Code Playgroud)

注意:由于某种原因,“CFBundleShortVersionString”没有在常量中定义,参见 iOS/MacOS 框架中是否有为 CFBundleShortVersionString 定义的常量