iOS 16.3.1设备Swift音频元数据获取代码失效问题排查
iOS 16.3.1 上 AVAsset 提取音频元数据全为 Null 的排查方案
几个值得优先排查的方向
- 元数据键值的系统映射变了
iOS 16.3.1 可能调整了 AVMetadataItem 的键值对应关系,比如你之前用的AVMetadataCommonKeyTitle这类通用键,现在可能读不到内容。先试试遍历所有元数据条目,打印出所有键和值,确认目标元数据是否存在,或者键名有没有变化:let asset = AVAsset(url: songURI) asset.loadMetadata { metadataItems in metadataItems.forEach { item in let key = item.commonKey?.rawValue ?? item.key?.rawValue ?? "未知键" let value = item.value ?? "无值" print("\(key): \(value)") } } - 文件权限的隐性校验更严了
虽然你移除了 security-scoped access 代码,但 iOS 16.3.1 可能对文件读取权限的校验逻辑变了。如果是通过文件选择器拿到的 URL,重新确认下是否在访问文件时正确调用了权限方法——哪怕之前移除过,也试试把权限包裹逻辑加回去:guard songURI.startAccessingSecurityScopedResource() else { print("获取文件权限失败") return } defer { songURI.stopAccessingSecurityScopedResource() } // 这里再初始化AVAsset并加载元数据 let asset = AVAsset(url: songURI) // ... 元数据加载逻辑 - 异步加载的时机没踩对
可能 iOS 16.3.1 下元数据加载的异步延迟更长,之前的代码可能在元数据还没加载完成就读取了。试试用 Swift Concurrency 的异步加载方式,确保等元数据加载完成再处理:let asset = AVAsset(url: songURI) Task { do { let metadata = try await asset.load(.metadata) // 在这里解析metadata里的标题、专辑等信息 } catch { print("元数据加载失败: \(error.localizedDescription)") } } - 特定音频格式的解析逻辑改了
你测试的音频文件可能刚好是 iOS 16.3.1 调整了解析逻辑的格式(比如某些编码的 MP3 或 M4A)。换几个不同格式、不同标签版本的音频文件试试,看是不是只有特定文件出问题。 - 系统缓存搞的鬼
试试重启你的 iPhone 13 Pro Max,或者删除应用重新安装,清除可能残留的媒体索引缓存——有时候系统媒体库的索引异常也会导致元数据读不出来。
临时替代思路
如果以上方法都没用,可以绕开 AVAsset,试试用 AVAudioFile 读取基础元数据,或者用第三方标签解析逻辑(比如手动解析 ID3 标签)直接读取文件内容,跳过系统的 AVAsset 解析逻辑。
内容的提问来源于stack exchange,提问作者Yurowitz
相关产品推荐
相关产品推荐

