如何在LaunchStoryboard中显示CFBundleShortVersionString?

时间:2016-05-13 15:40:00

标签: ios xcode storyboard

有没有办法在我的LaunchStoryboard中显示CFBundleShortVersionString作为UILabel文本,而不是每次递增时手动输入?我知道如何在代码中执行此操作,但是在显示LaunchStoryboard时无法运行代码 是否可以通过Xcode变量?

3 个答案:

答案 0 :(得分:5)

众所周知,您无法将代码放入启动屏幕。遗憾的是,没有一种内置的方法可以在启动屏幕中使用变量作为标签文本(类似于如何使用头文件中的值预处理Info.plist)。

实现目标的唯一选择是编写自己的脚本来更新LaunchScreen.storyboard文件,并将该脚本添加为目标的自定义构建阶段。

为了使这更容易,我会设置你的目标使用Info.plist的预处理器文件。完成并运行后,您现在可以在脚本中查询单独且简单的头文件来处理LaunchScreen.storyboard文件。

这是一个完整的解决方案:

创建一个名为Info.h的文件,并将其添加到项目的根目录中。

添加以下行:

#define APP_VERSION 2.6 // Update this version as needed

现在在Xcode中选择您的项目目标,然后转到常规选项卡。将版本值从您拥有的任何数字更改为APP_VERSION

现在选择Build Settings选项卡。在Info上搜索。在“打包”部分下,将Preprocess Info.plist File设置为Yes。同时将Info.plist preprocessing Prefix File设置为Info.h

现在,当您进行构建时,Info.plist中的CFBundleShortVersionString值将设置为Info.h文件中的值。

要更新启动屏幕文件中的标签以进行匹配,请执行以下操作:

选择启动屏幕故事板,然后选择包含版本号的标签。显示“标识检查器”窗格。在Label属性中输入APP_VERSION。如果您现在查看storyboard文件,标签的XML现在将显示userLabel属性,其值为APP_VERSION

返回项目目标并选择Build Phases选项卡。单击+图标,然后选择添加新的运行脚本阶段。将新阶段重命名为有用的内容,例如"更新启动版本"。然后将新阶段拖到现有的"复制捆绑资源"相。

现在打开新的"更新启动版本"相。在Shell字段中输入/bin/bash。将以下代码复制并粘贴到阶段:

VERSION=`cat Info.h | grep APP_VERSION | cut -f3 -d' '`

sed -e "/userLabel=\"APP_VERSION\"/s/text=\"[^\"]*\"/text=\"$VERSION\"/" Storyboard.storyboard > tmp.storyboard

现在做一个干净的构建。这是一个测试。查看tmp.storyboard并确保它看起来正确,并且应用版本的标签显示正确的版本。

一旦有效,请将以上代码更新为:

VERSION=`cat Info.h | grep APP_VERSION | cut -f3 -d' '`

sed -i bak -e "/userLabel=\"APP_VERSION\"/s/text=\"[^\"]*\"/text=\"$VERSION\"/" Storyboard.storyboard

此最终版本实际更新了启动屏幕故事板文件。之前的版本是一项测试,以确保其他所有工作都没有风险,从而破坏您的故事板。

答案 1 :(得分:3)

我想出了更新版本和版本的脚本。根据第一个答案在LaunchScreen.storyboard上构建标签,而不使用任何额外的文件。不幸的是,由于一些语法错误和不正确的路径,Clemens Brockschmidt的解决方案不起作用。

确保在Identity Inspector窗格中将标签命名为“APP_VERSION” - >文件 - >标签。

在“复制捆绑资源”阶段之前创建脚本。

这是shell的最终工作脚本: XCode 9(Swift 4)中的/ bin / sh:

#   ON/OFF Script Toggle (script ON with #, script OFF without #)
#exit 0

#   Increment build number
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"

#   Output version & build numbers into a label on LaunchScreen.storyboard
versionNumber=$(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" "${PROJECT_DIR}/${INFOPLIST_FILE}")
sed -i bak -e "/userLabel=\"APP_VERSION\"/s/text=\"[^\"]*\"/text=\"Version: $versionNumber Build: $buildNumber\"/" $PROJECT_DIR/$PROJECT_NAME/Base.lproj/LaunchScreen.storyboard

作为 BONUS 我已经包含了内置编号增量器和ON / OFF脚本切换,以便在您构建项目时禁用增量器。如果您有任何问题或者这对您有用,请告诉我。

答案 2 :(得分:-1)

修改

  

无法使启动屏幕动态化。不行善   与本地化等等

下面给出了另一种选择

  

上一个答案

您应该使您的初始VC类似于LaunchScreen.xib,并在其中制作标签。

现在,在ViewController中,您可以通过NSBundle方法访问info plist并设置其值。这将使得从“启动”屏幕到第一个VC的过渡变得平滑,看起来很自然,如果您想要动画版本代码或其他内容

let appVersion = NSBundle.mainBundle().infoDictionary["CFBundleVersion"];
 myLabel.text = "\(appVersion)"