Xcode Run Script Phase

1,460 阅读2分钟

这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战

Xcode Run Script Phase

Run Script运行脚本,Xcode在编译的时候可以添加运行脚本,同shell一样,但是很多可以使用一些项目中的参数.例如 '$CONFIGURATION' 编译模式,'$INFOPLIST_FILE' info.plist文件位置等,这里就不做过多说明了。Run Script能做很多事情,这里主要介绍一下编译版本号自增。

BundleVersion自增

xcode11版本之前

在xcode11之前,普遍的写法如下:

if [ $CONFIGURATION == Release ]; then
    echo "当前为 Release Configuration,开始自增 Build"
    plist=$INFOPLIST_FILE
    buildnum=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${plist}")
    if [[ "${buildnum}" == "" ]]; then
        echo "Error:在Plist文件里没有 Build 值"
        exit 2
    fi
    buildnum=$(($buildnum + 1))
    /usr/libexec/PlistBuddy -c "Set CFBundleVersion $buildnum" "${plist}" 
else
    echo $CONFIGURATION "当前不为 Release Configuration"
fi

先判断时是否是Release模式,在Release下,在info.plist文件读取CFBundleVersion的值,然后加1,然后在设置到info.plist文件。但是这个写法到了Xcode11之后就不适用了!因为Xcode11之后出现了新变化,如果在Genreal页面修改了build,在info.plist文件就不会是修改的数据,而是$(CURRENT_PROJECT_VERSION),所以这里会报错!

Xcode11之后报错

image.png

报错如下:

(error token is "$(CURRENT_PROJECT_VERSION) + 1")

image.png

Xcode11版本之后

写法

在Xcode11之后,该如去写,我的写法如下,如果有不正确的或者不同的见解欢迎大家讨论。

if [ $CONFIGURATION == Release ]; then
    echo "当前为 Release Configuration,开始自增 Build"
    plist=$INFOPLIST_FILE
    buildnum=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${plist}")
    if [[ "${buildnum}" == "" ]]; then
        echo "Error:在Plist文件里没有 Build 值"
        exit 2
    fi
    if [[ "${buildnum}" == "\$(CURRENT_PROJECT_VERSION)" ]]; then
        buildnum=$CURRENT_PROJECT_VERSION
    fi
    buildnum=$(($buildnum + 1))
    /usr/libexec/PlistBuddy -c "Set CFBundleVersion $buildnum" "${plist}" 
else
    echo $CONFIGURATION "当前不为 Release Configuration"
fi

思路

如果直接使用获取版本号$CURRENT_PROJECT_VERSION然后去加一的话,这种情况只生效一次,第二次Build就无法加了,所以必须考虑两种情况:

  1. 当info.plist中的值是’$(CURRENT_PROJECT_VERSION)‘,这种情况下取’$CURRENT_PROJECT_VERSION‘的值然后加1,实测没得问题!
  2. 当info.plist存的就是数字时,直接数字加1,实测没得问题!

Xcode13版本

Xcode13构建的项目和之前构建的存在很大的差别。Xcode13构建的项目info.plist文件内容并不不是真正编译后的info.plist文件,而是在编译时给你生成。配置权限等也移动到了项目设置的info列中。当然你也可以弄回之前的配置模式,上面的Run Script同样是可以用的。恢复旧版info.plist可查看这里

Xcode12和Xcode13构建的新OC项目的区别

  • Xcode12构建的项目

image.png

  • Xcode13构建的项目

image.png

image.png

Xcode13 info.plist 配置不生效问题

在info.plist文件中加入的配置,在每次info都改动的时候都会重置info.plist文件,因为开启了Generate info.plist File选项.所以在Xcode13中只能选择在info中改动,或者关闭Generate info.plist File 新建一个info.plist文件.

image.png