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

sli*_*lim 130 iphone xcode ipad ios-simulator

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

如我的Xcode项目目标的Properties窗口中所示.我想在我的应用程序的启动画面中显示这个,所以我知道人们当前使用的是哪个版本?

Bin*_*ian 380

两个号码!

营销版本号是针对客户的,称为版本号.它从1.0和上升的主要更新到2.0,3.0,轻微的更新到1.1,1.2和bug修复1.0.1,1.0.2.此编号面向版本和新功能.它不必停在9,1.11.23是一个合理的版本号.

构建号主要是在此之前构建内部构建数.但有些使用其他数字,如存储库的分支号或其提交号.此数字应该是唯一的,以区分不同的构建,这些构建只有少量的增量更改.


要获取版本号:

Objective-C的:

NSString * appVersionString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
Run Code Online (Sandbox Code Playgroud)

斯威夫特<3.0:

let appVersionString: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
Run Code Online (Sandbox Code Playgroud)

Swift 3.0:

let appVersionString: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
Run Code Online (Sandbox Code Playgroud)

要获取内部版本号:

Objective-C的:

NSString * appBuildString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];
Run Code Online (Sandbox Code Playgroud)

斯威夫特<3.0:

let buildNumber: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String
Run Code Online (Sandbox Code Playgroud)

Swift 3.0:

let buildNumber: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String   
Run Code Online (Sandbox Code Playgroud)

如果你想两者合为一体:

然后你必须先使用上面的行.

Objective-C的:

NSString * versionBuildString = [NSString stringWithFormat:@"Version: %@ (%@)", appVersionString, appBuildString];
Run Code Online (Sandbox Code Playgroud)

迅速:

let versionAndBuildNumber: String = "\(versionNumber) (\(buildNumber))"
Run Code Online (Sandbox Code Playgroud)

笔记:

主bundle中的值并不总是存在,例如在命令行应用程序中没有CFBundleShortVersionString或者CFBundleVersion,因此方法将返回nil并且它将崩溃,因为在代码中它会产生不正确的向下转换.但在普通的Cocoa iOS和Mac应用程序中,这些值已定义,不会被删除.

这是使用Xcode版本7.3(7D175)测试的.内部版本号通常用括号/括号括起来.内部版本号为十六进制或十进制.

buildandversion


Xcode中,您可以通过在项目设置的构建阶段中放置以下内容,将构建号自动递增为十进制数Run script

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

对于十六进制内部版本号,请使用此脚本

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"
Run Code Online (Sandbox Code Playgroud)

Xcode执行以下操作:

步骤1

步骤1

第2步

第2步

第3步

第三步:

  • 只是为了上面的例子添加,"CFBundleVersion"是Build = 300,"CFBundleShortVersionString"是版本= 0.41.维克多的答案应该是正确的答案. (4认同)

Esq*_*uth 12

您无需更改项目或Xcode中的任何内容.以下是单独的Swift版本:

let versionNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
let buildNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String
Run Code Online (Sandbox Code Playgroud)

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

https://github.com/goktugyil/EZSwiftExtensions

  • 是的,1.他的答案中有太多的噪音而且没有多少信号.这是迅速的,这是客观的.那是从ios5时代开始的 (3认同)

tan*_*ita 5

这是Swift 3的相同代码:

let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String
Run Code Online (Sandbox Code Playgroud)