iOS版本号详解与Build自动更新


Write In Frist:在这严肃😠的提出一个问题,希望有幸被大牛看到解释指导。
Q:在使用脚本更新build号后,在info里已经观察到修改到最新时间,但代码读取的仍是上次配置。十分不解!!!!!!即编译更新了的build号在下次运行中才会读取到。
A:我空出来,有解答了填补


Xcode

本文参考链接:

  1. Version vs build in XCode
  2. agvtool

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```

  1. 以时间为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

  1. 递增,类似使用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}"```

  1. 以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.
勾选此项,只在打包生效。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容