编程访问多个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
相关产品推荐
相关产品推荐

