ChatGPT解决这个技术问题 Extra ChatGPT

我的 iphone 应用程序如何检测自己的版本号?

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

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

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

此问题已在此处回答 stackoverflow.com/a/16888788/2890157
..链接的问题是4年后,所以这里真正的问题是cmos从未接受过答案。无论如何,链接问题的答案很有用,这里的答案也是如此。在这两个线程上,超越第一个答案 - 有时在稍后的答案中有更多最新信息。

C
Community

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"]]
i
idStar

基于 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];
}

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


c
clozach

两者分别的 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

它包含在此回购中,请查看:

https://github.com/goktugyil/EZSwiftExtensions


A
Arkady

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

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

希望这个简单的答案可以帮助某人...


对于我的需要,这很棒。谢谢。 +1
这将返回构建名称,而不是版本
@chancyWu,CFBundleShortVersionString 似乎给出了版本。
C
CharlesB

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


P
Pang

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

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


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

获取 XYZ 格式的版本字符串的简洁方法是:

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

或者,仅针对 XY:

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

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

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

J
John Erck
// Syncs with App Store and Xcode Project Settings Input
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];

正是我需要的!
X
Xavi López

您可以尝试将字典用作:-

NSDictionary *infoDictionary = [[NSBundle mainBundle]infoDictionary];

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

d
dengST30

斯威夫特 5:

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

获取 App 版本: if let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String { // 显示 appVersion }

获取 Build 版本: if let buildVersion = Bundle.main.infoDictionary?["CFBundleVersion"] as? String { // 当前 buildVersion }

非常感谢@Brad Larson♦


l
lostInTransit

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


r
rajat chauhan

您可以使用 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)"
}

J
Jeehut

如果您需要版本号和构建号的组合,这里有一个使用 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,则无需这样做。

我希望这有帮助!


a
apex39
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


D
D'Arcy Rittich

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

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


B
BatyrCan

你可以试试这个方法:

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