【问题标题】:How to read current app version in Xcode 11 with script如何使用脚本在 Xcode 11 中读取当前应用程序版本
【发布时间】:2019-11-05 10:34:21
【问题描述】:

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

的新部分

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

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

【问题讨论】:

  • 同样的问题。你找到解决办法了吗?

标签: ios xcode sh build-settings xcode11


【解决方案1】:

目前投票最多的答案展示了如何通过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

【讨论】:

  • 为什么我得到一个错误说DVTAssertions: Warning in /Library/Caches/com.apple.xbs/Sources/DVTiOSFrameworks/DVTiOSFrameworks-19450/DTDeviceKitBase/DTDKRemoteDeviceData.m:373
  • 嗨@user2027712。提供的信息,我不知道。我建议您为此打开一个专门的问题,提供所有需要的上下文、更多信息等。更好的是,如果您还没有这样做,请尝试在网络上搜索该错误消息。它看起来不像来自命令行的错误,这是这个答案的主题。我猜你的 Xcode 构建中一定有其他问题。
【解决方案2】:

如果您的项目设置为使用 Apple Generic Versioning,那么您可以使用以下命令:

agvtool what-marketing-version -terse1

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

【讨论】:

    【解决方案3】:

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

    较慢的方法(谢谢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 = //'

    【讨论】:

    • 如果您有多个构建方案需要获取它们的版本号,这将非常有用。只需在 xcodebuild 命令中传递 --scheme {SCHEME} 即可。
    • @SeanRobinson159 应该是 -scheme {SCHEME},与 -workspace {name}.xcodeworkspace 一起工作
    【解决方案4】:

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

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

    【讨论】:

    • 谢谢!这正是我所需要的
    【解决方案5】:

    将值保存到 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"
    

    【讨论】:

      【解决方案6】:

      如果你使用 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 的回答

      【讨论】:

        【解决方案7】:

        我正在为这种情况开发一个框架:

        • 工作区
        • 框架目标
        • 具有 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】:

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

          版本号和内部版本号在 ./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`
          

          结果:

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

          【讨论】:

          • 不错。为我工作。
          • 你应该使用xcodebuild -showBuildSettings而不是直接读取项目文件
          • xcodebuild -project ThreeOneOne.xcodeproj -showBuildSettings | grep "MARKETING_VERSION" | sed 's/[ ]*MARKETING_VERSION = //'
          • 在三个项目上使用 -showBuildSettings 进行了尝试,但没有获得 MARKETING_VERSION 和 CURRENT_PROJECT_VERSION。如果你得到它,竖起大拇指,去吧:)
          • @Babac 希望你已经解决了这个问题。您无法获得MARKETING_VERSION 的原因是您在工作区而不是项目中工作(暗示您手头有三个项目)。要获取版本,您可以发出以下命令:xcodebuild -workspace YourName.xcodeworkspace -scheme YourSchemeName -showBuildSettings | grep "MARKETING_VERSION"
          【解决方案9】:

          我遇到了类似的问题,并通过显示 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"
          

          【讨论】:

            【解决方案10】:

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

            【讨论】:

              【解决方案11】:

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

              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"
              

              【讨论】:

              • 这对我不起作用,或者我遗漏了一些东西。
              • 有没有办法在终端中也打印 $MARKETING_VERSION 的当前值?
              • @HansBondoka echo "The marketing version is: $MARKETING_VERSION"
              猜你喜欢
              • 2021-10-04
              • 1970-01-01
              • 1970-01-01
              • 2020-08-06
              • 2019-10-26
              • 2010-11-17
              • 2015-01-26
              • 1970-01-01
              • 2011-04-26
              相关资源
              最近更新 更多