Swift中如何从URLSession的resumeData解析字典中获取临时文件名
URLSession resumeData临时文件名提取解决方案
方案1:递归遍历全字典匹配规则(全版本兼容)
苹果CFNetwork生成的下载临时文件名规则固定为CFNetworkDownload_*.tmp,你可以通过递归遍历解析出来的属性列表所有层级的值,匹配符合规则的字符串即可拿到目标文件名,无需关心对应Key:
- 实现代码:
func findTempFileName(in content: Any) -> String? { // 匹配当前值是否为目标文件名 if let str = content as? String, str.hasPrefix("CFNetworkDownload_"), str.hasSuffix(".tmp") { return str } // 遍历字典层级 if let dict = content as? [AnyHashable: Any] { for (_, value) in dict { if let result = findTempFileName(in: value) { return result } } } // 遍历数组层级 if let array = content as? [Any] { for item in array { if let result = findTempFileName(in: item) { return result } } } return nil }
- 调用方法:
let resumeDictionary = try! PropertyListSerialization.propertyList(from: data, options: [], format: nil) as? [AnyHashable : Any] ?? [:] let targetFileName = findTempFileName(in: resumeDictionary)
方案2:直接用行业通用未公开Key取值(代码更简洁)
目前iOS所有公开版本中,该临时文件名对应的未公开固定Key为NSURLSessionDownloadEntryPath,可以直接通过Key取值:
if let resumeDict = try? PropertyListSerialization.propertyList(from: data, options: [], format: nil) as? [AnyHashable: Any], let tempFileName = resumeDict["NSURLSessionDownloadEntryPath"] as? String { // 此处拿到目标文件名 }
提示:未公开Key存在小概率随系统大版本更新变更的可能,建议两种方案组合使用,优先用Key取值,取不到再走递归遍历逻辑,兼顾代码简洁性和兼容性。
内容的提问来源于stack exchange,提问作者Mamad
相关产品推荐
相关产品推荐

