You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 15:43:19