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

作者: Leehf | 来源:发表于2017-03-28 23:06 被阅读996次

    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 可以自行设定但必须设定。
    ![](https://img.haomeiwen.com/i1661816/b8f5905316ae9ec3.png)
    2. 添加脚本 `$xcrun agvtool next-version -all` 这代码修改build号递增
    ![](https://img.haomeiwen.com/i1661816/b3e5e22b82ca9f8c.png)
    3. Run你的App。就会发现build号自动修改了。
    ![](https://img.haomeiwen.com/i1661816/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 --添加新的脚本**
    ![执行过程](https://img.haomeiwen.com/i1661816/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.
    勾选此项,只在打包生效。

    相关文章

      网友评论

        本文标题:iOS版本号详解与Build自动更新

        本文链接:https://www.haomeiwen.com/subject/tvcrottx.html