【问题标题】:Get version number of iOS Universal Framework in client在客户端获取 iOS 通用框架的版本号
【发布时间】:2014-08-23 15:55:04
【问题描述】:

这可能不仅限于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 中的当前信息。但是我们如何找到框架的信息。就我而言,特别是嵌入式框架。

【问题讨论】:

  • 你做到了吗?
  • 不,恐怕不会。然而,我们正在从 iOS 通用框架迁移到原生 Xcode 6 Cocoa Touch 框架,也许我们会在那里有更好的运气。如果我弄明白了,我会在这里更新。
  • 感谢您的确认
  • 如果它是您的嵌入式框架,您可以提供一些可供客户端访问的方法或属性,这些方法或属性将指向:[[[NSBundle bundleForClass:[MyFrameworkClass class]] infoDictionary] objectForKey:@"CFBundleShortVersionString"] ;
  • 这就是我获取框架包的方式 -NSBundle *rampBundle = [NSBundle bundleWithIdentifier:@"com.example.framework"];

标签: ios cocoa-touch frameworks ios-universal-framework


【解决方案1】:

假设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”未在常量中定义,参见Is there a constant defined for CFBundleShortVersionString in iOS/MacOS framework

【讨论】:

  • __bridge 之前需要加NSString吗?
  • @gabbler 我认为我们需要 __bridge 因为值是 CFString @NikolayDimitrov Foo 应该是您想要信息的框架中的类型,您也可以尝试使用键“CFBundleShortVersionString”(未在常量 cf stackoverflow.com/questions/32187359/… 中定义)
【解决方案2】:

这适用于可能希望在您的框架上拥有一个函数,该函数可以在控制台上返回或打印它的版本以及内部版本号。只需确保在声明 *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; }

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      我发现 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[];
      

      【讨论】:

      • 我不会将此标记为已接受的答案,因为大多数访问此页面的人都会寻找 iOS 通用框架的答案,但随着时间的推移,大多数人会对新的 Cocoa 感兴趣触摸框架,这里是它们的答案。
      • 我正在尝试这个,但是尽管我的框架的 info.plist 为 CFBundleVersion 和 CFBundleShortVersionString 设置了 3.3,但当我 NSLog 'FrameworkVersionNumber' 或 'FrameworkVersionString' 时,我得到了 '1'。这些常量在框架的 plist 中究竟在哪里提取它们的值?
      • @YoCoh 据我所知,常量不会从 plist 文件中提取版本号。相反,您可以通过更新项目的Build SettingsVersioning 下的Current Project Version 字段来设置您的版本。您会注意到,默认情况下,Versioning System 设置为 Apple Generic。这就是这两个常量的更新方式。但是,字符串版本不仅返回版本号,还包括项目和目标的名称。我不知道你怎么能摆脱它。
      • 有谁知道为什么在Swift中,模块中只生成了var FrameworkVersionNumber: Double,而没有为FrameworkVersionString[]生成变量?
      • 怕不是...FrameworkVersionNumber 是双精度数,所以它只支持一个小数点,例如设置 3.2.1 的版本只需将其更改为双精度值“3.2000000”。我需要做的是提取确切的版本号组件,我相信我可以使用FrameworkVersionString[] 来完成(如果它在 Swift 中公开的话)。鉴于这有点离题,我现在将其作为一个单独的问题发布在这里:stackoverflow.com/questions/31418303/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      • 1970-01-01
      • 2018-12-07
      • 1970-01-01
      相关资源
      最近更新 更多