如何从网络下载的Data类型plist文件中获取bundle-version
如何从下载的plist Data中提取bundle-version
嘿,我完全懂你这种碰壁的感受——明明下载到了plist的Data,却死活提不出bundle-version,甚至想绕去用XMLParser还发现不对路子。其实不用这么麻烦,Foundation框架里就有专门处理plist的API,能轻松搞定这个问题,而且还能兼容XML和二进制两种格式的plist(这大概率是你之前尝试无效的原因,毕竟很多plist现在是二进制的,XMLParser根本认不出来)。
下面直接上可行的解决方案,附带详细说明:
核心方法:用PropertyListSerialization解析Data
PropertyListSerialization是Apple官方提供的plist解析工具,能自动识别并解析XML、二进制格式的plist数据,步骤很简单:
- 将下载得到的Data解析成字典(绝大多数Info类的plist都是字典结构);
- 从字典中提取对应版本号的键值(注意键名可能有两种情况)。
完整代码示例
func getBundleVersion(from plistData: Data) -> String? { do { // 解析Data为plist对象,强制转成字典类型 guard let plistDictionary = try PropertyListSerialization.propertyList( from: plistData, options: [], format: nil ) as? [String: Any] else { print("错误:解析后的plist不是字典结构") return nil } // 提取版本号,兼容标准键名和自定义键名 if let standardVersion = plistDictionary["CFBundleVersion"] as? String { return standardVersion } else if let customVersion = plistDictionary["bundle-version"] as? String { return customVersion } print("错误:未找到bundle-version或CFBundleVersion键") return nil } catch { print("解析plist失败:\(error.localizedDescription)") return nil } }
为什么你之前的方法可能无效?
- 如果你之前尝试手动解析XML,但下载的plist是二进制格式(现在很多iOS/macOS的plist默认是二进制),那XMLParser肯定无法识别,自然提取不到数据;
- 键名混淆:标准的Info.plist中,内部版本号的键是
CFBundleVersion,显示版本号是CFBundleShortVersionString,有些自定义plist可能会用bundle-version这种简化键名,所以要两种情况都考虑到。
排查小技巧
如果还是提取失败,可以先验证下载的Data是否是有效的plist:
// 将Data转成字符串,查看plist内容是否完整正确 if let plistString = String(data: plistData, encoding: .utf8) { print("plist内容:\n\(plistString)") } else { print("Data无法转成UTF8字符串,可能是二进制plist或数据损坏") }
这样能快速确认是数据本身的问题,还是解析逻辑的问题。
内容的提问来源于stack exchange,提问作者j3141592653589793238




