44

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中,项目的构建设置中有一个新部分,称为版本控制

在此处输入图像描述

CFBundleShortVersionString自动更改为$(MARKETING_VERSION). Xcode 会自动处理它,我不想手动将其更改为静态数字并让 Xcode 完成它的工作。

11

所以问题是我怎样才能访问这个新的并使用运行脚本MARKETING_VERSION将它设置为我的 launchScreen 标签?

4

11 回答 11

37

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 = //'

于 2020-01-09T20:04:46.630 回答
17

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

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"
于 2019-07-08T17:53:57.990 回答
16

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

版本和内部版本号显示./PROJECTNAME.xcodeproj/project.pbxproj为 MARKETING VERSION (MV) 和 CURRENT PROJECT VERSION (CPV)。

版本号

内部编号

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

结果:

版本号和内部版本号

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

于 2019-11-08T15:56:42.630 回答
4

我在这里想念一个针对多个目标和配置的解决方案:

xcodebuild -target <target> -configuration <configuaration> -showBuildSettings  | grep -i 'MARKETING_VERSION' | sed 's/[ ]*MARKETING_VERSION = //'
  • 目标:目标的名称
  • 配置:发布,调试
于 2020-07-24T08:19:31.467 回答
2

如果你使用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 通用版本控制系统时才从 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的回答

于 2019-11-24T21:12:05.743 回答
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"
于 2020-04-02T23:31:39.727 回答
1

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

agvtool what-marketing-version -terse1

更多关于如何设置AGV的信息可以在这里找到。

于 2021-01-26T10:18:07.703 回答
1

到目前为止,大多数投票的答案都展示了如何通过sed链中的其他工具来提取价值。想通过awk.

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

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

# output
    MARKETING_VERSION = 0.0.1

默认的 awk 字段分隔符应该是空格,因此只需提取第三个字段(MARKETING_VERSION是第一个,等号是第二个):

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

# output
0.0.1

高温高压

于 2021-06-01T15:13:56.963 回答
0

对于 Node.js:有xcode 包。使用示例:

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包,但随着最新的 xCode 更改,它变得过时了,因为我无法从Info.plistReact Native 项目中提取版本。

于 2019-10-10T16:27:09.427 回答
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"
于 2019-10-26T07:00:10.697 回答
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")
于 2019-11-15T14:53:51.313 回答