ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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


D
Display Name

有2个数字!

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

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

获取版本号:

目标-C:

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

斯威夫特 < 3.0:

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

Swift 3.0+(用 5.0 测试):

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

要获取内部版本号:

目标-C:

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

斯威夫特 < 3.0:

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) 测试的。内部版本号通常写在括号/大括号中。内部版本号为十六进制或十进制。

https://i.stack.imgur.com/V9NpK.png

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

https://i.stack.imgur.com/VDFG3.png

第2步

https://i.stack.imgur.com/22DIX.png

第 3 步

https://i.stack.imgur.com/uezqN.png


只需为上面的示例添加,“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,我必须检查一下。感谢您的提醒。
s
shim

您无需更改项目或 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: "...")
t
tanaschita

这里是 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) 包含预期值。
S
Sandip Patel - SM

以编程方式显示版本和内部版本号 - 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) )"

A
Amr Angry

我为 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")"
    }
}

S
Sivabalaa Jothibose

你也可以使用喜欢

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)