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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:15:09