我有一个用Xcode 3开发的应用程序,最近开始用Xcode 4编辑。在目标摘要中,我有带有字段的iOS应用程序目标表单:标识符、版本、构建、设备和部署目标。版本字段是空白的,构建字段是3.4.0(这与我仍然使用Xcode 3编辑应用程序时的版本相匹配)。
我的问题是:
版本和构建字段之间的区别是什么? 为什么我升级到Xcode 4后版本字段是空的?
我有一个用Xcode 3开发的应用程序,最近开始用Xcode 4编辑。在目标摘要中,我有带有字段的iOS应用程序目标表单:标识符、版本、构建、设备和部署目标。版本字段是空白的,构建字段是3.4.0(这与我仍然使用Xcode 3编辑应用程序时的版本相匹配)。
我的问题是:
版本和构建字段之间的区别是什么? 为什么我升级到Xcode 4后版本字段是空的?
当前回答
另一种方法是在appDelegate didFinishLaunchingWithOptions中设置版本号:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSString * ver = [self myVersion];
NSLog(@"version: %@",ver);
NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:ver forKey:@"version"];
return YES;
}
- (NSString *) myVersion {
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
return [NSString stringWithFormat:@"%@ build %@", version, build];
}
其他回答
另一种方法是在appDelegate didFinishLaunchingWithOptions中设置版本号:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSString * ver = [self myVersion];
NSLog(@"version: %@",ver);
NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:ver forKey:@"version"];
return YES;
}
- (NSString *) myVersion {
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
return [NSString stringWithFormat:@"%@ build %@", version, build];
}
如果构建号是浮点值,那么上面答案中自动递增构建号的脚本对我不起作用,所以我稍微修改了一下:
#!/bin/bash
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=`echo $buildNumber +1|bc`
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"
感谢@nekno和@ale84的精彩回答。
但是,我修改了@ale84的脚本,它很少增加浮点的构建号。
incl的值可以根据您的浮动格式要求进行更改。 例如:如果incl = .01,输出格式为 ... 1.19, 1.20, 1.21 ...
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
incl=.01
buildNumber=`echo $buildNumber + $incl|bc`
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"
营销发布号是针对客户的,称为版本号。它从1.0开始,主要更新到2.0、3.0,次要更新到1.1、1.2,错误修复到1.0.1、1.0.2。这个数字是面向发布和新功能。
构建号主要是在此之前构建的内部编号。但有些使用其他数字,如存储库的分支编号。这个编号应该是唯一的,以区分几乎相同的不同构建。
如您所见,版本号不是必需的,由您决定要使用哪个版本号。所以如果你把Xcode更新到一个主版本,build字段是空的。版本字段不能为空!
获取构建号作为NSString变量:
NSString * appBuildString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];
获取版本号作为NSString变量:
NSString * appVersionString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
如果你想把两者都放在一个NSString中:
NSString * versionBuildString = [NSString stringWithFormat:@"Version: %@ (%@)", appVersionString, appBuildString];
这是用Xcode版本4.6.3 (4H1503)测试的。版本号通常用括号/大括号表示。构建号为十六进制或十进制。
在Xcode中,你可以通过在项目设置的Run脚本构建阶段中放置以下内容,将构建号自动增加为十进制数
#!/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 14.2上,并将以下bash脚本添加到项目包中的.sh文件中。然后我使用一个运行脚本构建阶段来调用这个脚本。当我存档项目时,版本和包更新了几次,但随后停止了增量。关于为什么脚本不会继续增加有任何反馈吗?感谢反馈。
currentVersionString=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$PROJECT_DIR/SupportingFiles/$INFOPLIST_FILE")
currentBuildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$PROJECT_DIR/SupportingFiles/$INFOPLIST_FILE")
newBuildNumber=$((currentBuildNumber + 1))
IFS='.' read -ra version <<< "$currentVersionString"
version[2]=$((version[2] + 1))
newVersionString="${version[0]}.${version[1]}.${version[2]}"
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $newVersionString" "$PROJECT_DIR/SupportingFiles/$INFOPLIST_FILE"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $newBuildNumber" "$PROJECT_DIR/SupportingFiles/$INFOPLIST_FILE"