iOS Swift 应用程序版本和构建号:简单解决方案

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

如何在 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\n
    \n
  • CFBundleShortVersionString — 这是用户在 App Store 和应用程序设置中看到的内容。通常看起来像“1.0”、“2.3.1”等。这是面向用户的版本。
  • \n
  • CFBundleVersion — 这是内部构建号。它可以是任何内容:“42”、“20240315”、“1.0.0.123”。这是面向开发者的版本,有助于区分同一版本的不同构建。
  • \n
\n\n

为什么要分开?想象一下,您发布了 1.0 版本,但发现了一个严重错误。您修复了它,但没有更改功能——这对用户来说仍然是 1.0 版本,但您增加了构建号(例如,从 1 增加到 2)。这样,您既不会让用户感到困惑,也可以在 Crashlytics 中看到具体是哪个构建崩溃了。

\n\n

最简单的方法:Bundle.main

\n\n

Apple 通过 Bundle.main 对象提供了对这些数据的便捷访问。以下是您在 Stack Overflow 上能找到的经典解决方案:

\n\n
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 文件)。
  • \n
  • infoDictionary — 读取 Info.plist 的字典。
  • \n
  • 我们使用 as? String 进行可选类型转换,并使用 ?? 运算符以防键不存在(尽管这不太可能)。
  • \n
\n\n

进阶方法:从 ProcessInfo 读取

\n\n

想看起来像专业人士?使用 ProcessInfo。这个类比 plist 更了解系统。但对于应用程序版本,它并没有提供新内容,但可以显示操作系统。不过有一个技巧:如果您将数据获取封装在 extension 中,代码会变得更清晰且更可重用。

\n\n
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) (构建                

博客

书籍推荐