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

编程访问多个info.plist返回nil 如何正确读取plist资源文件

自定义plist文件读取返回nil的解决方案

第一步:排查基础配置问题

  • 确认文件名大小写完全匹配:iOS真机文件系统大小写敏感,模拟器不敏感,需保证forResource参数的字符串和你实际plist文件名(不含后缀)的大小写完全一致,比如文件名为MyPlist-Info.plist就不能写成myplist-info
  • 确认文件归属正确:检查plist文件的Target Membership勾选的是你当前运行的target,且在Build Phases的Copy Bundle Resources列表中能看到该文件,没有出现红色缺失标记
  • 确认plist未存放在Asset Catalog:如果plist是放在xcassets里的,无法通过url方法读取,需要使用NSDataAsset读取

第二步:正确的读取代码实现

读取自定义plist文件的完整代码

// 替换参数为你实际的plist文件名(不含后缀)
guard let plistUrl = Bundle.main.url(forResource: "Myplist-Info", withExtension: "plist") else {
    print("plist文件不存在,请检查文件名和配置")
    return
}
do {
    // 读取plist数据
    let plistData = try Data(contentsOf: plistUrl)
    // 解析plist为字典,若你的plist根类型是数组可调整为[Any]
    guard let plistDict = try PropertyListSerialization.propertyList(from: plistData, format: nil) as? [String: Any] else {
        print("plist格式错误,不是字典类型")
        return
    }
    // 读取plist内的键值对
    print(plistDict)
} catch {
    print("读取plist失败:\(error.localizedDescription)")
}

读取target默认Info.plist的简化方法

如果你要读取的是当前target自带的Info.plist,不需要手动拼接路径,直接使用以下代码即可:

if let infoDict = Bundle.main.infoDictionary {
    // 直接读取对应key即可,比如读取App版本号
    let version = infoDict["CFBundleShortVersionString"] as? String
    print(version ?? "")
}

存放在Asset Catalog中的plist读取方法

如果你的plist是放在xcassets里的,使用以下代码读取:

guard let asset = NSDataAsset(name: "Myplist-Info") else {
    print("xcassets中不存在该plist资源")
    return
}
do {
    let plistDict = try PropertyListSerialization.propertyList(from: asset.data, format: nil) as? [String: Any]
    print(plistDict ?? [:])
} catch {
    print("解析失败:\(error)")
}

特殊场景注意

如果你的代码是写在Framework、App Extension或者静态库中,不要使用Bundle.main,需要替换为对应模块的Bundle:

// 替换YourClass为当前模块内的任意类名,即可获取到当前模块的Bundle
let bundle = Bundle(for: YourClass.self)
// 后续用这个bundle来读取资源

内容的提问来源于stack exchange,提问作者Joakim Sjöstedt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:27:01