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

如何从网络下载的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数据,步骤很简单:

  1. 将下载得到的Data解析成字典(绝大多数Info类的plist都是字典结构);
  2. 从字典中提取对应版本号的键值(注意键名可能有两种情况)。

完整代码示例

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

火山引擎 最新活动