如何在SwiftUI中显示类似15a240d的Git Commit SHA版本标识?
如何在SwiftUI应用中显示类似
15a240d格式的版本标识? 我想在SwiftUI应用里显示15a240d这类格式的版本标识,但尝试了很多方法都没成功。我之前写过这段代码,但不知道这类标识对应的键名是什么:
var applicationBuildNumber: String? { return infoDictionary?["CFBundleLongVersion"] as? String }
以下是我的完整代码:
import SwiftUI /// An extension that gets the build and version number of this xcodeproj /// as a String /// extension Bundle { var applicationVersionNumber: String? { return infoDictionary?["CFBundleShortVersionString"] as? String } // create a var like above var applicationBuildNumber: String? { return infoDictionary?["CFBundleVersion"] as? String } } struct SLInfoView: View { let versionNumber = Bundle.main.applicationVersionNumber ?? "Version Number Not Available" let buildNumber = Bundle.main.applicationBuildNumber ?? "Build Number Not Available" var body: some View { NavigationStack { List { Section() { HStack { Text("Version number") Spacer() Text(versionNumber) .foregroundStyle(.gray) } HStack { Text("Commit SHA") Spacer() Text("15a240d") // FIXME: Replace Text with the version number thingy .foregroundStyle(.gray) } HStack { Text("Build") Spacer() Text(buildNumber) .foregroundStyle(.gray) } } header: { Text("General infos") } footer: { Text("Those informations are needed if you want to report an issue") } } .navigationTitle("Info") .navigationBarTitleDisplayMode(.inline) } } } #Preview { SLInfoView() }
注:此问题与另一问题相关:Type of expression is ambiguous without a type annotation
已尝试方案
- 试过把
CFBundleVersion换成CFLongBundleVersion、ProductVersionString或者kCFBundleVersionKey as String,均无效
解决方法
15a240d这类格式的标识其实是Git提交的短SHA值,默认不会自动加入到应用的Info.plist中,需要手动配置:
步骤1:添加Build Phase脚本
- 打开Xcode项目,选中你的target,切换到
Build Phases标签页 - 点击左上角的
+按钮,选择New Run Script Phase - 在脚本输入框中粘贴以下内容:
# 获取当前Git提交的短SHA值 GIT_SHA=$(git rev-parse --short HEAD) # 将SHA值写入Info.plist的GitCommitSHA字段 /usr/libexec/PlistBuddy -c "Set :GitCommitSHA $GIT_SHA" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
步骤2:在Bundle扩展中添加读取方法
在你的Bundle扩展里新增一个属性,用来读取刚才写入的Git SHA:
extension Bundle { // ... 已有的applicationVersionNumber和applicationBuildNumber var gitCommitSHA: String? { return infoDictionary?["GitCommitSHA"] as? String } }
步骤3:在View中使用
在SLInfoView里添加对应的属性,并替换FIXME的文本:
struct SLInfoView: View { let versionNumber = Bundle.main.applicationVersionNumber ?? "Version Number Not Available" let buildNumber = Bundle.main.applicationBuildNumber ?? "Build Number Not Available" let commitSHA = Bundle.main.gitCommitSHA ?? "Commit SHA Not Available" var body: some View { NavigationStack { List { Section() { HStack { Text("Version number") Spacer() Text(versionNumber) .foregroundStyle(.gray) } HStack { Text("Commit SHA") Spacer() Text(commitSHA) .foregroundStyle(.gray) } HStack { Text("Build") Spacer() Text(buildNumber) .foregroundStyle(.gray) } } header: { Text("General infos") } footer: { Text("Those informations are needed if you want to report an issue") } } .navigationTitle("Info") .navigationBarTitleDisplayMode(.inline) } } }
这样编译运行后,就能在界面上显示当前Git提交的短SHA值了。
内容的提问来源于stack exchange,提问作者n3v1010
相关产品推荐
相关产品推荐

