如何以编程方式在 iOS 应用程序中显示目标的版本/内部版本号?

Posted

技术标签:

【中文标题】如何以编程方式在 iOS 应用程序中显示目标的版本/内部版本号?【英文标题】:How to programmatically display version/build number of target in iOS app? 【发布时间】:2011-03-02 05:49:27 【问题描述】:

如何以编程方式获取target version 的值,如下图所示?

在我的 Xcode 项目目标的“属性”窗口中可以看到。我想在我的应用程序的初始屏幕中显示它,以便我知道人们当前使用的是哪个版本?

【问题讨论】:

【参考方案1】:

我为 Bundle 做了一个扩展,所以它会很容易使用

extension Bundle 
    var releaseVersionNumber: String? 
        return infoDictionary?["CFBundleShortVersionString"] as? String
    

    var buildVersionNumber: String? 
        return infoDictionary?["CFBundleVersion"] as? String
    

    var applicationName: String 
        return infoDictionary?["CFBundleDisplayName"] as? String ?? "ADKATech"
    

    var applicationReleaseDate: String 
        return infoDictionary?["ApplicationReleaseDate"] as? String ?? Date().description
    

    var applicationReleaseNumber: Int 
        return infoDictionary?["ApplicationReleaseNumber"] as? Int ?? 0
    

    var releaseVersionNumberPretty: String 
        return "\(releaseVersionNumber ?? "1.0.0")"
    

    var buildVersionNumberPretty: String 
        return "\(buildVersionNumber ?? "1")"
    

【讨论】:

【参考方案2】:

你也可以用like

var appVersion: String 
  //versionNumber
  let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"

  //buildNumber
  let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"

  return "Version: #\(versionNumber) (#\(buildNumber))"

然后你可以在全局声明时在任何地方使用。

print(appVersion)

输出:

Version: #1.0 (#1.0.3)

【讨论】:

【参考方案3】:

2 个数字!

营销版本号是针对客户的,称为版本号。它从 1.0 开始,主要更新到 2.03.0,对于 1.1 的次要更新、1.2 以及 1.0.11.0.2 的错误修复。这个数字是面向版本和新功能的。不一定要停在9,1.11.23是一个合理的版本号。

内部版本号主要是在此之前完成的内部版本号。但是有些使用其他数字,例如存储库的分支号或其提交号。这个数字应该是唯一的,以区分不同的构建,它们只有微小的增量变化。


获取版本号:

目标-C:

NSString * appVersionString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];

斯威夫特

let appVersionString: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String

Swift 3.0+(用 5.0 测试):

let appVersionString: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String

要获得 build 编号:

目标-C:

NSString * appBuildString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];

斯威夫特

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

Swift 3.0+(测试到 5.0):

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

如果您希望两者合二为一:

先用上面几行,再用下面几行。

目标-C:

NSString * versionBuildString = [NSString stringWithFormat:@"Version: %@ (%@)", appVersionString, appBuildString];

Swift(测试到 5.0):

let versionAndBuildNumber: String = "\(appVersionString) (\(buildNumber))"

注意事项:

主包中的值并不总是存在,例如在命令行应用程序中没有CFBundleShortVersionStringCFBundleVersion,因此这些方法将返回nil,它会崩溃,因为它在代码中不正确的沮丧。 但在普通的 Cocoa ios 和 Mac 应用程序中,这些值是已定义的,不会被删除。

这是使用 Xcode 版本 7.3 (7D175) 测试的。内部版本号通常写在括号/大括号中。内部版本号为十六进制或十进制。


Xcode 中,您可以将 build number 自动递增为 decimal number,方法是将以下内容放在 Run script build 阶段项目设置

#!/bin/bash    
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

十六进制版本号使用这个脚本

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$((0x$buildNumber)) 
buildNumber=$(($buildNumber + 1)) 
buildNumber=$(printf "%X" $buildNumber)
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

对于Xcode,请执行以下操作:

步骤 1

第二步

第三步

【讨论】:

只是为上面的例子添加,“CFBundleVersion”是Build=300,“CFBundleShortVersionString”是Version=0.41。维克托的答案应该是正确的答案。 我曾经遇到过十六进制数字的问题。 Apple 声明使用整数:developer.apple.com/library/ios/documentation/general/Reference/… Swift 3.0 的内容已重命名:现在是 Bundle.main.object(forInfoDictionaryKey: "...") @AlexZavatone,您是否仍然在 XCode 12 中看到相同的问题,即 CFBundleVersion 没有被复制到字典中?在 XCode 12.4 中它对我有用,并且通过我的应用程序项目,我能够成功检索 CFBundleShortVersionString。 XCode12 是我使用的第一个版本,所以这可能与从 CFBundleVersion 到 CFBundleShortVersionString 的更改有关? @Rethunk,我得去看看。感谢您的提醒。【参考方案4】:

以编程方式显示版本和内部版本号 - Swift 4.0

let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"

let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"            

let versionAndBuildNumber = "Ver #\(versionNumber) ( Build #\(buildNumber) )"

【讨论】:

【参考方案5】:

您无需更改项目或 Xcode 中的任何内容。以下是两者的 Swift 版本:

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

它已包含在此 repo 中,请查看:

https://github.com/goktugyil/EZSwiftExtensions

【讨论】:

哪个答案?我没看到 只有一个答案,在他的第二段 是的,1. 他的回答噪音太大,信号不多。 2. 这是swift,即objective-c。 3.那是ios5时代的 Swift 3.0 的内容已重命名:现在是 Bundle.main.object(forInfoDictionaryKey: "...")【参考方案6】:

这里 Swift 3 的代码相同:

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

【讨论】:

Bundle.main 给我一个空的infoDictionary;也许是因为我是在一个框架内做的,而不是一个可执行文件或应用程序? Bundle(for: MyClass.self) 包含预期值。

以上是关于如何以编程方式在 iOS 应用程序中显示目标的版本/内部版本号?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式在 iOS 13 中隐藏和显示状态栏?

强制用户在 iOS 中以编程方式更新应用程序

以编程方式关闭标记的信息窗口谷歌地图 iOS

以编程方式确定 iOS 项目中的当前目标(运行或测试)

如何在 ios 9 中以编程方式导航到另一个具有“当前上下文”表示的视图控制器,目标 C

iOS v10 或更低版本:如何以编程方式在导航栏底部添加 UISearchController