You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Swift应用获取版本信息返回nil,Info.plist为空如何设置版本?

你的问题解答:空Info.plist导致版本信息读取失败

嘿,别担心,不是你的应用没有版本信息——问题出在那个看似空的Info.plist文件上!Xcode的新版本默认会把Info.plist的核心配置整合到项目设置中,而不是以直观的键值对形式显示在plist文件里,这才导致你读取不到正确的内容。下面一步步帮你解决问题:

为什么你的代码返回nil?

你手动读取的那个Info.plist文件,实际上只是一个引用了项目变量的模板文件(你可以右键选择「Open As」->「Source Code」查看真相),里面的CFBundleNameCFBundleVersion等字段都是$(变量名)的形式,编译前并不会替换成实际值。所以你的代码读取的是这些未解析的变量字符串,自然拿不到正确的版本信息。

正确获取版本信息的代码

其实不用手动读取plist文件,Bundle已经提供了直接读取整合后配置的API,用下面的代码就能轻松拿到版本信息:

基础写法

import Foundation

// 获取应用名称
let appName = Bundle.main.object(forInfoDictionaryKey: "CFBundleName") as? String ?? "未知应用"
// 获取内部Build号(对应CFBundleVersion)
let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as? String ?? "未知Build"
// 获取对外显示的版本号(对应CFBundleShortVersionString)
let shortVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String ?? "未知版本"

print(appName)
print(buildNumber)
print(shortVersion)

类型安全的写法(iOS 13+/macOS 10.15+)

import Foundation

if let appName = Bundle.main.infoDictionary?["CFBundleName"] as? String {
    print("应用名称:\(appName)")
}

let buildNumber = Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? ""
let shortVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? ""

print("Build号:\(buildNumber)")
print("版本号:\(shortVersion)")

这些方法会直接读取项目设置中配置的实际值,完全不受那个空plist文件的影响。

如何在Xcode中设置/修改版本信息?

有两种简单直观的方式:

方式1:通过「Info」标签页

  1. 打开Xcode项目,选中左侧导航栏最顶部的项目根节点
  2. 选择你的应用Target(注意不是Project选项)
  3. 切换到「Info」标签页
  4. 向下滚动找到「Bundle versions string, short」(对应对外显示的版本号,比如1.0)和「Bundle version」(对应内部Build号,比如1)
  5. 直接在输入框中修改数值即可

方式2:通过「Build Settings」标签页

  1. 同样选中应用Target,切换到「Build Settings」标签页
  2. 在顶部搜索框输入「version」,定位到「Versioning」分组
  3. 「Marketing Version」对应对外显示的版本号(CFBundleShortVersionString),「Current Project Version」对应内部Build号(CFBundleVersion)
  4. 修改这两个值完成配置

为什么Info.plist看起来是空的?

这是Xcode的默认优化:新版本的Xcode会把Info.plist的核心配置和项目设置绑定,以变量引用的形式存储在plist文件中(比如$(PRODUCT_NAME)$(MARKETING_VERSION)),编译时才会替换成实际值。所以你用默认的plist编辑器打开时,看不到具体的键值对,只会显示一个空的界面——但它其实不是真的空,只是展示方式变了。

内容的提问来源于stack exchange,提问作者A.HADDAD

火山引擎 最新活动