如何自动设置Watchkit应用程序目标的版本和内部版本号

dog*_*god 25 ios apple-watch watchkit

Watchkit应用程序和扩展的版本和内部版本号(或版本和简短版本)必须设置为与包含应用程序相同的值.

我使用环境变量Info.plist在构建时动态设置应用程序版本.这也适用于Watchkit扩展,但不适用于Watchkit应用程序.

我使用的环境变量必须在主应用和扩展的plist中提供${}(对于${VERSION}我设置的变量VERSION).
如果我为Watchkit应用程序执行相同的操作,它将获取字符串本身,而不是值.如果我提供美元和括号,变量中没有数据.

知道如何设置Watchkit应用程序的变量吗?

Tho*_*sen 17

我用它来更新所有目标:

#!/bin/bash
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$SRCROOT/Great WatchKit App/Info.plist"
Run Code Online (Sandbox Code Playgroud)

  • 当然。请参阅下面我的答案(如果我投票,请参阅上面的答案:)) (2认同)

Luc*_*ien 14

CFBundleVersionmastergit repo 上我的分支上的提交数量.

在我的主要应用目标上,Build Phases> + New Run Script Phase我添加了此脚本:

# Set the build number to the count of Git commits
buildNumber=$(git rev-list --count HEAD)
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$SRCROOT/app WatchKit Extension/Info.plist"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$SRCROOT/app WatchKit App/Info.plist"
Run Code Online (Sandbox Code Playgroud)

app WatchKit Appapp应该是你的应用程序的名称,但检查的确切路径.


dog*_*god 6

stk 的答案是正确的,但我也想添加我的发现。

解决该问题的一种方法是使用agvtools

在OSX > 其他 > 外部构建系统中创建一个新目标 ,添加与此类似的运行脚本:

#!/bin/bash

#read vesion number from version.txt in project root
VERSION=$(head -n 1 version.txt)
BUILD=`git rev-list $(git rev-parse --abbrev-ref HEAD) | wc -l | awk '{ print $1 }'`

echo "${VERSION} (${BUILD})"

agvtool new-marketing-version ${VERSION}
agvtool new-version -all ${BUILD}

exit 0
Run Code Online (Sandbox Code Playgroud)

我有一个version.txt文件,其中仅包含我的版本号(营销版本短捆绑版本),可以通过任何 CI 系统轻松调整该文件,并使用我的 git SHA 的数量作为构建号(捆绑版本)调整源VERSIONBUILD使其适合您的要求

在构建/归档之前运行为新目标创建的方案。

如果您需要将此作为主要目标的依赖项 - 这将失败,因为它将停止执行以下目标(如果有人知道如何防止这种情况,我将感谢您的提示)

但是您仍然可以通过为每个 plist 执行如下脚本来实现这一点(类似于 stk 提供的):

#!/bin/sh
#
# usage:
# set-version-in-plist.sh LIST VERSION BUILD
# LIST:      Info.plist path & name
# VERSION:   version number xxx.xxx.xxx
# BUILD:     build number xxxxx
#

# Location of PlistBuddy
PLISTBUDDY="/usr/libexec/PlistBuddy"

${PLISTBUDDY} -c "Set :CFBundleShortVersionString $2" "$1";
${PLISTBUDDY} -c "Set :CFBundleVersion $3" "$1";
Run Code Online (Sandbox Code Playgroud)

将此脚本保存为文件,使其可执行 ( chmod +x SCRIPTNAME) 然后使用提到的参数为所有 plist 执行它

该解决方案不如agvtools解决方案那么方便,但在依赖项中使用时它不应该停止您的构建......


dav*_*sdk 6

您可以在没有构建脚本的情况下更新所有目标的构建版本。(您也可以使用它来更新营销/简短构建版本;在这种情况下,忽略对 CFBundleVersion 的更改)。

打开您的项目设置并将 CURRENT_PROJECT_VERSION(当前项目版本)设置为所需的版本号。在所有目标中,使 sur CURRENT_PROJECT_VERSION 为空(因此它的值是从项目继承的)。然后在所有 Info.plist 文件中将 CFBundleShortVersionString(捆绑版本字符串,短)和 CFBundleVersion(捆绑版本/构建版本)设置为 $(CURRENT_PROJECT_VERSION)。

如果您想在每次构建时增加您的 CFBundleVersion(或让它反映您的 git SHA)。按照 doggod 的描述使用 agvtool 或参见https://developer.apple.com/library/ios/qa/qa1827/_index.html


Tre*_*v14 6

简单、容易、无需编写脚本

使用 Xcode 13.4.1 进行测试

这是迄今为止跨目标同步内部版本号和营销版本的最简单方法。

步骤1

确保项目的Current Project VersionMarketing Version已设置。这将是您的内部版本号和营销版本的唯一事实来源。通过单击导航器中的项目,单击项目(目标上方),然后在过滤器中键入“版本控制”来查找这些设置。

设置项目构建号和营销版本

第2步

同步内部版本号/项目版本(例如 123)

在您的目标中,转到Build Settings选项卡并设置Current Project Version$(CURRENT_PROJECT_VERSION)

在您的 .plist 文件中设置Bundle version(与 相同CFBundleVersion)为$(CURRENT_PROJECT_VERSION).

同步营销版本(例如1.2.3)

在您的目标中,转到Build Settings选项卡并设置Marketing Version$(MARKETING_VERSION)

在您的 .plist 文件中设置Bundle version string (short)(与 相同CFBundleShortVersionString)为$(MARKETING_VERSION).

这是我关于该主题的博客文章的链接,其中包含更多有用的屏幕截图


Sam*_*ner 5

我有一个附加到我的主要应用程序目标的运行脚本。它将在构建应用程序时传播 WatchKit 扩展和 WatchKit 应用程序。

它是完全可重复使用的。享受!

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")

buildNumberDec=$(($buildNumber + 1))

/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumberDec" "${PROJECT_DIR}/${INFOPLIST_FILE}"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumberDec" "$SRCROOT/${PRODUCT_NAME} WatchKit Extension/Info.plist"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumberDec" "$SRCROOT/${PRODUCT_NAME} WatchKit App/Info.plist"
Run Code Online (Sandbox Code Playgroud)


stk*_*stk 4

好吧,如果 \xc2\xb4 不能像这样工作,请使用Run Script Build Phase. 做这样的事情:

\n\n
#!/bin/sh\nINFOPLIST="${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"\necho "writing to $INFOPLIST"\nPLISTCMD="Set :CFBundleVersion $(git rev-list --all|wc -l)"\necho -n "$INFOPLIST" | xargs -0 /usr/libexec/PlistBuddy -c "$PLISTCMD"\n
Run Code Online (Sandbox Code Playgroud)\n\n

我没有\xc2\xb4t为你的WatchKit应用程序提供正确的路径,所以你必须自己改变它。

\n

  • 这不起作用,因为您无法(从 Xcode 6.3 开始)向 watchkit 应用程序添加任何类型的构建阶段,只有 watchkit 扩展可以具有构建阶段。 (4认同)
  • 已经找到了该解决方案,但我更喜欢 agvtool - 它一次性设置所有 plist (2认同)