如何在 Swift 中获取应用程序版本和构建号:带代码的完整解释
\n\n您是否曾想过,为什么在 App Store 中同一个应用程序可能被称为“我的Messenger 3.2”,而在手机设置中却是“3.2.1 (45)”?或者为什么当您报告错误时,开发人员会要求您提供“构建号”?答案很简单:每个 iOS 应用程序内部都隐藏着两个数字——应用程序版本和构建号。今天,我们将学习如何使用 Swift 提取它们。这是 Stack Overflow 上最热门的问题之一(数万次浏览!),这并非没有原因:了解这两行代码可以为您节省数小时的调试时间并避免用户烦恼。
\n\n在本文中,我们不仅仅是复制论坛上的答案。我们将深入探讨什么是版本和构建号,为什么需要它们,如何正确获取它们,以及最重要的是,如何避免踩坑。让我们开始吧!
\n\n什么是版本 (version) 和构建号 (build number)?
\n\n在编写代码之前,让我们先弄清楚术语。在 Xcode 的 Info.plist 文件(或项目设置)中,有两个键:
- \n
- CFBundleShortVersionString — 这是用户在 App Store 和应用程序设置中看到的内容。通常看起来像“1.0”、“2.3.1”等。这是面向用户的版本。 \n
- CFBundleVersion — 这是内部构建号。它可以是任何内容:“42”、“20240315”、“1.0.0.123”。这是面向开发者的版本,有助于区分同一版本的不同构建。 \n
为什么要分开?想象一下,您发布了 1.0 版本,但发现了一个严重错误。您修复了它,但没有更改功能——这对用户来说仍然是 1.0 版本,但您增加了构建号(例如,从 1 增加到 2)。这样,您既不会让用户感到困惑,也可以在 Crashlytics 中看到具体是哪个构建崩溃了。
\n\n最简单的方法:Bundle.main
\n\nApple 通过 Bundle.main 对象提供了对这些数据的便捷访问。以下是您在 Stack Overflow 上能找到的经典解决方案:
import UIKit\n\nclass ViewController: UIViewController {\n\n override func viewDidLoad() {\n super.viewDidLoad()\n \n // 获取应用程序版本\n let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "Unknown"\n // 获取构建号\n let buildNumber = Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "Unknown"\n \n print("应用程序版本: \\(appVersion)")\n print("构建号: \\(buildNumber)")\n \n // 在 UI 中的使用示例\n versionLabel.text = "版本 \\(appVersion) (构建 \\(buildNumber))"\n }\n}\n\n\n一切都很简单。但让我们逐行分析:
\n- \n
Bundle.main— 这是您应用程序的主包(.app 文件)。 \ninfoDictionary— 读取Info.plist的字典。 \n- 我们使用
as? String进行可选类型转换,并使用??运算符以防键不存在(尽管这不太可能)。 \n
进阶方法:从 ProcessInfo 读取
\n\n想看起来像专业人士?使用 ProcessInfo。这个类比 plist 更了解系统。但对于应用程序版本,它并没有提供新内容,但可以显示操作系统。不过有一个技巧:如果您将数据获取封装在 extension 中,代码会变得更清晰且更可重用。
import Foundation\n\nextension Bundle {\n var appVersion: String {\n return infoDictionary?["CFBundleShortVersionString"] as? String ?? "Unknown"\n }\n \n var buildNumber: String {\n return infoDictionary?["CFBundleVersion"] as? String ?? "Unknown"\n }\n \n var fullVersion: String {\n return "版本 \\(appVersion) (构建