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

SwiftUI中如何获取Xcode版本与构建号并嵌入反馈邮件

获取SwiftUI应用的版本号与构建号并嵌入邮件正文

嘿,这个问题我之前也碰到过,其实从Xcode配置的版本信息里读取数据非常简单,直接通过Bundle就能搞定!下面是具体的解决步骤:

1. 编写获取版本与构建号的计算属性

在你的View结构体里添加一个私有计算属性,用来拼接版本号和构建号:

private var appVersionBuild: String {
    // 读取版本号(对应Xcode里的「Version」)
    let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "Unknown Version"
    // 读取构建号(对应Xcode里的「Build」)
    let build = Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "Unknown Build"
    // 拼接成「版本号(构建号)」的友好格式
    return "\(version) (\(build))"
}

这里做了容错处理,如果意外获取不到信息,会显示Unknown Version (Unknown Build),避免出现崩溃或空白内容。

2. 修改邮件按钮代码,嵌入版本信息

接下来调整你原有的按钮逻辑,重点是对邮件正文进行URL编码(避免换行、空格等字符破坏链接结构),然后把版本信息嵌入进去:

Button(action: {
    // 获取拼接好的版本信息
    let versionInfo = appVersionBuild
    
    // 用多行字符串构建原始邮件正文,可读性更强
    let rawBody = """
    Hallo,
    i will tell you something about this app:
    
    Version: \(versionInfo)
    """
    
    // 对正文进行URL编码,确保特殊字符被正确转义
    guard let encodedBody = rawBody.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed),
          let mailURL = URL(string: "mailto:mail@mymailadress.com?subject=MyApp%20Feedback&body=\(encodedBody)") else {
        return
    }
    
    // 打开系统邮件应用
    UIApplication.shared.open(mailURL, options: [:], completionHandler: nil)
}) {
    HStack{
        Image(systemName: "envelope")
        Text("send a mail to mail@mymailadress.com")
    }
    .padding(10)
    .foregroundColor(.white)
    .background(LinearGradient(gradient: Gradient(colors: [Color("GradientStart"), Color("GradientEnd")]), startPoint: .topLeading, endPoint: .bottomTrailing))
    .cornerRadius(10, antialiased: false)
    .shadow(radius: 10)
}

小提示

  • 如果你需要单独使用版本号或构建号,可以把计算属性拆分成两个独立的属性,比如appVersion和appBuild。
  • 这种方法兼容所有iOS版本,不需要依赖系统新API,稳定性拉满。

内容的提问来源于stack exchange,提问作者Enrico

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 11:38:11