如何使用脚本读取Xcode 11中的当前应用程序版本

时间:2019-06-23 09:41:33

标签: ios xcode sh build-settings xcode11

Xcode 11 之前,我使用了一个脚本来读取当前应用程序版本(适用于AppStore),并帮助我更改了LaunchScreen,因为我们不能为此使用swift。

sourceFilePath="$PROJECT_DIR/$PROJECT_NAME/App/Base.lproj/LaunchScreen.storyboard"
versionNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$INFOPLIST_FILE")
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")

sed -i .bak -e "/userLabel=\"APP_VERSION_LABEL\"/s/text=\"[^\"]*\"/text=\"v$versionNumber\"/" "$PROJECT_DIR/$PROJECT_NAME/App/Base.lproj/LaunchScreen.storyboard"

但是在 Xcode 11 中,项目的构建设置中有一个名为 Versioning

的新部分。

enter image description here

然后CFBundleShortVersionString自动更改为$(MARKETING_VERSION)。 Xcode会自动处理该问题,并且我不想手动将其更改为静态数字,而让Xcode起作用。

11

所以问题是我该如何使用运行脚本将其访问新的MARKETING_VERSION并将其设置为launchScreen标签?

11 个答案:

答案 0 :(得分:16)

Xcode 11/12

在项目的终端 bash脚本中,您可以使用:

应用版本

xcodebuild -showBuildSettings | grep MARKETING_VERSION | tr -d 'MARKETING_VERSION =' // will be displayed 1.1.6

内部版本

xcodebuild -showBuildSettings | grep CURRENT_PROJECT_VERSION | tr -d 'CURRENT_PROJECT_VERSION =' // will be displayed 7

或者(不要忘记将 YouProjectName 更改为您的项目名称):

应用版本

cat YouProjectName.xcodeproj/project.pbxproj | grep -m1 'MARKETING_VERSION' | cut -d'=' -f2 | tr -d ';' | tr -d ' '

内部版本

cat YouProjectName.xcodeproj/project.pbxproj | grep -m1 'CURRENT_PROJECT_VERSION' | cut -d'=' -f2 | tr -d ';' | tr -d ' '

较慢的方法(Thx Joshua Kaden):

应用版本

xcodebuild -project YouProjectName.xcodeproj -showBuildSettings | grep "MARKETING_VERSION" | sed 's/[ ]*MARKETING_VERSION = //'

内部版本

xcodebuild -project YouProjectName.xcodeproj -showBuildSettings | grep "CURRENT_PROJECT_VERSION" | sed 's/[ ]*CURRENT_PROJECT_VERSION = //'

答案 1 :(得分:7)

在互联网上找不到正确的答案,所以我开始进行挖掘。

版本和内部版本号在./PROJECTNAME.xcodeproj/project.pbxproj中显示为“营销版本(MV)”和“当前项目版本(CPV)”。

version number

build number

我用 sed 来获取数字。它查找MV或CPV的首次出现,删除编号以外的所有内容,然后返回结果。为了使其正常工作,您需要做两件事:

  • 导航到项目根文件夹
  • 将PROJECTNAME更改为您的项目名称

命令:

version_number=`sed -n '/MARKETING_VERSION/{s/MARKETING_VERSION = //;s/;//;s/^[[:space:]]*//;p;q;}' ./PROJECTNAME.xcodeproj/project.pbxproj`
build_number=`sed -n '/CURRENT_PROJECT_VERSION/{s/CURRENT_PROJECT_VERSION = //;s/;//;s/^[[:space:]]*//;p;q;}' ./PROJECTNAME.xcodeproj/project.pbxproj`

结果:

version and build numbers

注意:如果您的工作空间中有更多具有不同版本和内部版本号的目标,那么这可能对您不起作用,因为它在第一次出现时就停止了。在这种情况下,祝你好运:)

答案 2 :(得分:1)

如果您使用 Bitrise ,则以下脚本将为您保存:

提取应用营销版本

envman add --key=APP_VERSION_NO --value=`sed -n '/MARKETING_VERSION/{s/MARKETING_VERSION = //;s/;//;s/^[[:space:]]*//;p;q;}' ./${PATH_TO_YOUR_PROJECT_XCODEPROJ_FILE}/project.pbxproj`

提取应用内部版本号

仅当您使用 Apple Generic 版本控制系统时,才从xcodeproj文件中提取内部版本号,否则从XCode项目的info.plist文件中提取内部版本号。

注意:以下脚本从xcodeproj文件中提取内部版本号。

envman add --key=APP_BUILD_NO --value=`sed -n '/CURRENT_PROJECT_VERSION/{s/CURRENT_PROJECT_VERSION = //;s/;//;s/^[[:space:]]*//;p;q;}' ./${PATH_TO_YOUR_PROJECT_XCODEPROJ_FILE}/project.pbxproj`

打印到控制台:

envman run bash -c 'echo "App Version: $APP_VERSION_NO"'

envman run bash -c 'echo "App Build No: $APP_BUILD_NO"'

感谢@babac的回答

答案 3 :(得分:1)

将值保存到CURRENT_PROJECT_VERSION如何?有没有人设法做到这一点?

我可以得到类似的值

buildNumber=$CURRENT_PROJECT_VERSION

但这不起作用:

CURRENT_PROJECT_VERSION=""    or   $CURRENT_PROJECT_VERSION=""

就我而言,我试图将其设置为“”

此行也未设置CURRENT_PROJECT_VERSION字段

/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$appInfoPlist"

答案 4 :(得分:0)

您可以像使用其他任何项目变量一样使用它:

sourceFilePath="$PROJECT_DIR/$PROJECT_NAME/App/Base.lproj/LaunchScreen.storyboard"
versionNumber="$MARKETING_VERSION"
buildNumber="$CURRENT_PROJECT_VERSION"

sed -i .bak -e "/userLabel=\"APP_VERSION_LABEL\"/s/text=\"[^\"]*\"/text=\"v$versionNumber\"/" "$PROJECT_DIR/$PROJECT_NAME/App/Base.lproj/LaunchScreen.storyboard"

答案 5 :(得分:0)

对于Node.js:有xcode package。用法示例:

const xcode = require('xcode');

const project = xcode.project('ios/PROJECT_NAME.xcodeproj/project.pbxproj').parse(() => {
  const config = project.pbxXCBuildConfigurationSection();
  const releaseScheme = Object.keys(config).find(key => config[key].name === 'Release');

  const version = config[releaseScheme].buildSettings.MARKETING_VERSION;
});

以前,我使用plist包,但是由于无法对React Native项目从Info.plist中提取一个版本,因此最新的xCode更改已过时。

答案 6 :(得分:0)

我遇到了类似的问题,并通过显示MARKETING_VERSION本身使其起作用:

version="$MARKETING_VERSION"
version+=" ("
version+=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" $SRCROOT/MyApp/Info.plist`
version+=")"

/usr/libexec/PlistBuddy "$SRCROOT/MyApp/Settings.bundle/Root.plist" -c "set PreferenceSpecifiers:1:DefaultValue $version"

答案 7 :(得分:0)

我正在用这种情况开发框架:

  • 工作区
  • 框架目标
  • 具有2个外部脚本的聚合目标:
    • 一个构建胖框架的人
    • 准备发布框架的其他人

关键是在XCode 11中,聚合框架脚本未获取其他工作空间目标的运行环境变量,因此无法从我的框架目标中读取$ MARKETING_VERSION。

因此适用于我的解决方案是 使用PlistBuddy通过这种方式指定框架目标构建的Info.plist结果

FAT_FRAMEWORK="${SRCROOT}/build/${FRAMEWORK_NAME}.framework"
BUILD_NUMBER=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${FAT_FRAMEWORK}/Info.plist")
VERSION_NUMBER=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "${FAT_FRAMEWORK}/Info.plist")

答案 8 :(得分:0)

我在这里错过了针对多个目标和配置的解决方案:

xcodebuild -target <target> -configuration <configuaration> -showBuildSettings  | grep -i 'MARKETING_VERSION' | sed 's/[ ]*MARKETING_VERSION = //'
  • 目标:目标的名称
  • 配置:发布,调试

答案 9 :(得分:0)

如果您的项目设置为使用 Apple 通用版本控制,那么您可以使用以下命令:

agvtool what-marketing-version -terse1

有关如何设置 AGV 的更多信息,请参见 here

答案 10 :(得分:0)

现在投票最多的答案展示了如何通过 sed 和链中的其他工具提取价值。想通过 awk 提供一个(更简单?)解决方案。

只是为了提供一点上下文,以下一行显示了罪魁祸首:

xcodebuild -project MyProj/MyProj.xcodeproj -showBuildSettings | awk '/MARKETING_VERSION/ { print }'

# output
    MARKETING_VERSION = 0.0.1

默认的 awk 字段分隔符应该是空格,所以这只是提取第三个字段的问题:

xcodebuild -project MyProj/MyProj.xcodeproj -showBuildSettings | awk '/MARKETING_VERSION/ { print $3 }'

# output
0.0.1

HTH