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