【问题标题】:How can my iphone app detect its own version number?我的 iphone 应用程序如何检测自己的版本号?
【发布时间】:2010-10-02 07:10:31
【问题描述】:

我正在编写一个 iPhone 应用程序。它已经发布了,但我想添加一个显示其版本号的功能。

我宁愿不必对我发布的每个版本都手动执行此操作...

Objective-C 中有没有办法找出我的应用程序的版本?

【问题讨论】:

  • 这个问题已经在这里stackoverflow.com/a/16888788/2890157回答了。
  • .. 链接的问题是 4 年后,所以这里的真正问题是 cmos 从未接受答案。无论如何,链接问题的答案很有用,这里的答案也是如此。在这两个线程上,不要只看第一个答案 - 有时会有更多关于稍后答案的最新信息。

标签: iphone ios version


【解决方案1】:

使用修订控制系统处理这是一件好事。这样,当您从用户那里收到错误报告时,您可以检查该代码的修订版并(希望)重现运行与用户完全相同的代码的错误。

这个想法是,每次构建时,您都将运行一个脚本来获取代码的当前修订号并更新项目中的文件(通常使用某种形式的令牌替换)。然后,您可以编写一个始终在错误输出中包含修订号的错误处理例程,或者您可以将其显示在“关于”页面上。

【讨论】:

    【解决方案2】:

    您可以在 plist.info 中指定 CFBundleShortVersionString 字符串,并使用 provided API 以编程方式读取该字符串。

    【讨论】:

      【解决方案3】:

      As I describe here,我使用脚本用我当前的 Subversion 修订号重写头文件。该修订号存储在 kRevisionNumber 常量中。然后,我可以使用类似于以下内容的方式访问版本和修订号:

      [NSString stringWithFormat:@"Version %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"], kRevisionNumber]
      

      这将创建一个格式为“Version 1.0 (51)”的字符串。

      【讨论】:

      • 返回了我的构建版本,所以我使用了这个。 [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]
      • CFBundleVersion 不正确,因为 Xcode 错误地使用内部版本号而不是版本号填充该 plist 条目。 jspooner 是正确的。
      • 请参阅stackoverflow.com/questions/6851660/version-vs-build-in-xcode-4,了解版本号与内部版本号的详细说明。确认CFBundleShortVersionString 是您通常想要的“版本”和CFBundleVersion 的内部版本号。
      • kRevisionNumber 似乎对我不起作用。为了获得指定的输出,我这样做了(使用 @jspooner 的修复):[NSString stringWithFormat:@"Version: %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"], [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]]
      【解决方案4】:

      读取应用程序的 info.plist 文件并获取键 CFBundleShortVersionString 的值。阅读 info.plist 会给你一个 NSDictionary 对象

      【讨论】:

        【解决方案5】:

        基于 Brad Larson 的回答,如果您在 info plist 中存储了主要和次要版本信息(就像我在特定项目中所做的那样),这对我来说效果很好:

        - (NSString *)appNameAndVersionNumberDisplayString {
            NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
            NSString *appDisplayName = [infoDictionary objectForKey:@"CFBundleDisplayName"];
            NSString *majorVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
            NSString *minorVersion = [infoDictionary objectForKey:@"CFBundleVersion"];
        
            return [NSString stringWithFormat:@"%@, Version %@ (%@)", 
                        appDisplayName, majorVersion, minorVersion];
        }
        

        现在手动更新次要版本可能会很痛苦,因此使用源存储库修订号技巧是理想的。如果您没有将其绑定(因为我没有),那么上面的 sn-p 可能很有用。它还会提取应用的显示名称。

        【讨论】:

          【解决方案6】:

          获取X.Y.Z格式的版本字符串的简洁方法是:

          [NSBundle mainBundle].infoDictionary[@"CFBundleVersion"]
          

          或者,对于 X.Y:

          [NSBundle mainBundle].infoDictionary[@"CFBundleShortVersionString"]
          

          这两个 sn-ps 都返回您将分配给标签对象的文本属性的字符串,例如

          myLabel.text = [NSBundle mainBundle].infoDictionary[@"CFBundleVersion"];
          

          【讨论】:

            【解决方案7】:

            这就是我在我的应用程序中所做的

            NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
            

            希望这个简单的答案能对某人有所帮助...

            【讨论】:

            • 满足我的需求,这很棒。谢谢。 +1
            • 这将返回构建名称,而不是版本
            • @chancyWu,CFBundleShortVersionString 似乎给出了版本。
            【解决方案8】:

            您可以尝试使用字典作为:-

            NSDictionary *infoDictionary = [[NSBundle mainBundle]infoDictionary];
            
            NSString *buildVersion = infoDictionary[(NSString*)kCFBundleVersionKey];
            NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey]
            

            【讨论】:

              【解决方案9】:
              // Syncs with App Store and Xcode Project Settings Input
              NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
              

              【讨论】:

              • 正是我需要的!
              【解决方案10】:

              有两件事 - 构建版本和应用版本。

              1. 获取应用版本:

                NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
                
              2. 获取构建版本:

                NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
                

              【讨论】:

              • 这两者有什么区别吗?他们都为我返回相同的结果。
              • 是的,可能是您的内部版本号和应用程序版本在设置中相同。
              • 好的,我的 RAKEFILE 中只有一个设置 - app.version(我正在使用 RubyMotion)。我想两者都可以满足我的需要。谢谢
              • 谢谢,伙计。工作顺利。
              • 仅供参考最好使用objectForInfoDictionaryKey: 而不是infoDictionary] objectForKey:,因为前者返回本地化值(如果有的话)。不过在这里可能不会有什么不同;)
              【解决方案11】:

              两个单独的 Swift 版本:

              斯威夫特 3

              let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
              let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String
              

              斯威夫特 2

              let versionNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
              let buildNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String
              

              它包含在这个 repo 中,检查一下:

              https://github.com/goktugyil/EZSwiftExtensions

              【讨论】:

                【解决方案12】:

                如果您需要 version build num组合,这里有一个使用 Swift 3 的捷径:

                let appVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"]!
                let buildNum = Bundle.main.infoDictionary!["CFBundleVersion"]!
                let versionInfo = "\(appVersion) (build \(buildNum))"
                // versionInfo is now something like "2.3.0 (build 17)"
                

                as! String 添加到appVersionbuildNum 行的末尾以仅将该部分作为String 对象。如果您正在寻找完整的versionInfo,则无需这样做。

                我希望这会有所帮助!

                【讨论】:

                  【解决方案13】:

                  您可以使用 infoDictionary 从您的应用程序的 info.plist 中获取版本详细信息。此代码适用于 swift 3。只需调用此方法并在任何首选 UI 元素中显示版本。

                  Swift-3  
                  
                  func getVersion() -> String {
                      let dictionary = Bundle.main.infoDictionary!
                      let version = dictionary["CFBundleShortVersionString"] as! String
                      let build = dictionary["CFBundleVersion"] as! String
                      return "v\(version).\(build)"
                  }
                  

                  【讨论】:

                    【解决方案14】:

                    你可以试试这个方法:

                    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
                    

                    【讨论】:

                      【解决方案15】:
                      func getAppVersion() -> String {
                          let dictionary = Bundle.main.infoDictionary!
                          let versionValue = dictionary["CFBundleShortVersionString"] ?? "0"
                          let buildValue = dictionary["CFBundleVersion"] ?? "0"
                          return "\(versionValue) (build \(buildValue))"
                      }
                      

                      基于@rajat chauhan 的回答,没有强制转换为String

                      【讨论】:

                        【解决方案16】:

                        斯威夫特 5:

                        有两件事 - 应用版本和构建版本

                        • 获取应用版本:

                           if let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
                                // present appVersion
                          }
                          
                        • 获取构建版本:

                           if let buildVersion = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
                                // present buildVersion
                           }
                          

                        非常感谢@Brad Larson♦

                        【讨论】:

                          猜你喜欢
                          • 2010-12-23
                          • 2010-10-12
                          • 2010-09-07
                          • 2011-12-18
                          • 1970-01-01
                          • 1970-01-01
                          • 2013-08-14
                          • 2012-05-17
                          • 2013-01-12
                          相关资源
                          最近更新 更多