Write In Frist:在这严肃😠的提出一个问题,希望有幸被大牛看到解释指导。
Q:在使用脚本更新build号后,在info里已经观察到修改到最新时间,但代码读取的仍是上次配置。十分不解!!!!!!即编译更新了的build号在下次运行中才会读取到。
A:我空出来,有解答了填补
本文参考链接:
iOS版本号详解
名词解释
- Version:通常所说的版本号。一般由产品部门确定。一般有两段式(1.3)、三段式(3.1.23)。
- Build:编译号指一次唯一编译标识, 通常是一个递增整数。用来内部使用,区分一次内部版本。
iOS 开发中,这个2个号码都可以任意字符串或数字.
我们目前遇到的情况有: - 忽略了 Version 或 Build. 这两个号中的一个常年的不会发生变化.
- 颠倒了 Version 和 Build.
获取方法
NSString *version = [[NSBundle mainBundle].infoDictionary
valueForKey:@"CFBundleShortVersionString"];
NSString *build = [[NSBundle mainBundle].infoDictionary
valueForKey:@"CFBundleVersion"];```
###自动修改Build号
#####方法一:agvtool (Apple-generic versioning tool for Xcode projects)
[agvtool](https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man8/agvtool.8.html), 是苹果的命令行工具, 集成在Xcode中. (关于versioning的更多描述和agvtool的用法可以参考官方链接,描述的很详细)。
此处我们讲常用的:[更多语法官方描述](https://developer.apple.com/library/content/qa/qa1827/_index.html)
`修改Version为2.0`
`xcrun agvtool new-marketing-version 2.0`
`Build 递增`
`xcrun agvtool next-version -all`
`显示当前Version`
`agvtool what-marketing-version`
**具体方法**
1. Targets -- BuildSetting -- 搜索Versioning
修改Versioning System 。 Current Version 可以自行设定但必须设定。
![](//upload-images.jianshu.io/upload_images/1661816-b8f5905316ae9ec3.png)
2. 添加脚本 `$xcrun agvtool next-version -all` 这代码修改build号递增
![](//upload-images.jianshu.io/upload_images/1661816-b3e5e22b82ca9f8c.png)
3. Run你的App。就会发现build号自动修改了。
![](//upload-images.jianshu.io/upload_images/1661816-0001856ae98fdf6b.png)
**Note:**递增方式为整型,也就是说 1 -->2 、 1.1 -->2
` 使用agvtool亦有局限性,相比之下更推荐使用PlistBuddy,完成由脚本控制`
#####方法二:PlistBuddy
>PlistBuddy是一个Mac里的命令行下读写plist文件的工具。
位于/usr/libexec/下,由于这个路径不在默认的PATH里,需要通过绝对路径/usr/libexec/PlistBuddy引用。
######列出几个可能会遇见的语句
1. 添加: ```plistbuddy -c 'Add :Software:Gallery:Version string "1.0"' ~/Desktop/com.sample.plist```
2. 输出: ```plistbuddy -c "Print" ~/Desktop/com.sample.plist```
3. 修改: ```plistbuddy -c 'Set :Software:Gallery:Version "1.1"' ~/Desktop/com.sample.plist```
4. 删除: ```plistbuddy -c 'Delete :Software:Gallery:Version' ~/Desktop/com.sample.plist```
5. 合并: ```plistbuddy -c "Merge ~/Desktop/Global.plist :Software:Gallery" ~/Desktop/com.sample.plist```
如果你想知道更多关于PlistBuddy,可以点击[PlistBuddy](http://blog.csdn.net/a351945755/article/details/46561249)。也可Google。
**使用方法也很简单,直接在targets -- buildPhase --添加新的脚本**
![执行过程](http://upload-images.jianshu.io/upload_images/1661816-6009ce7904290550.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
######接下来我列出几个常用的脚本,复制粘贴替换即可。
***Note放前面,由于Xcode的特殊性,在每段代码后面记得加一个Tab。不然会编译失败!!!***
1. 区分Release和Debug
if [ "${CONFIGURATION}" = "Release" ]; then
Release加入你要执行的脚本
else
Debug下要执行的脚本
fi```
- 以时间为Build号
buildNumber=`date +"%m-%d-%H:%M"`
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"```
`会显示当前时间如:03-28-22:28`
`date +"%m-%d-%y" == 03-28-17 月-日-年格式
date +"%m-%d-%Y" == 03-23-2017 月-日-年格式
date +"%T" == 22:46:04 显示当前时间
date +"%r" == 10:46:04 PM 12小时制
date +"%H-%M" == 22-46 显示HH-MM格式`
3. 基于Version来构建Build号
shortVersion=$(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=date +"%m%d"
buildNumber="$shortVersion.$buildNumber"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}" ```
第一句为读取当前的Version
- 递增,类似使用agvtool,少了配置,只需要运行脚本
buildnum=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "$PRODUCT_SETTINGS_PATH")
buildnum=$((buildnum + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildnum" "$PRODUCT_SETTINGS_PATH"```
5. 以Git提交记录来作为Build
buildNumber=$(git rev-list HEAD | wc -l | tr -d ' ')
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"```
- 以SVN提交记录来作为Build
buildNumber=`svnversion -nc | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'`
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"```
___
**Write In Last:后续也会持续更新脚本,如果你有更好的,欢迎留言补充。**
___
#####补充1 :Run script only when installing
字面解释,运行脚本只在安装时
>With Run script only when installing checked, the script only runs when do Product Archive.
勾选此项,只在打包生效。