iOS 11中如何获取/Documents目录下文件及MP3的元数据?
在iOS 11中获取Documents目录下MP3的音乐元数据及文件通用元数据
嘿,刚好我之前做过类似的音乐播放器开发,给你分享下具体的实现方案,都是iOS官方框架的用法,在iOS 11上完全适用~
一、获取MP3文件的艺术家、专辑封面等音乐元数据
要提取音乐的专业元数据,AVFoundation是最佳选择,苹果原生支持,能精准解析MP3里的ID3标签信息。步骤如下:
- 先导入AVFoundation框架
import AVFoundation
- 拼接Documents目录下MP3文件的完整URL
假设你已经拿到了文件名fileName,可以这样生成文件URL:
guard let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { print("无法获取Documents目录") return } let mp3FileURL = documentsURL.appendingPathComponent(fileName)
- 异步加载并解析元数据
元数据读取可能耗时,一定要用异步方式避免卡主线程:
let asset = AVAsset(url: mp3FileURL) // 加载我们需要的元数据类型 let metadataKeys = [ AVMetadataIdentifier.commonIdentifierArtist, AVMetadataIdentifier.commonIdentifierAlbumName, AVMetadataIdentifier.commonIdentifierArtwork ] asset.loadValuesAsynchronously(forKeys: ["commonMetadata"]) { DispatchQueue.main.async { var artist: String? var albumName: String? var albumArtwork: UIImage? // 检查加载状态 switch asset.statusOfValue(forKey: "commonMetadata", error: nil) { case .loaded: // 遍历所有元数据,匹配我们需要的字段 for item in asset.commonMetadata { guard let identifier = item.identifier else { continue } switch identifier { case AVMetadataIdentifier.commonIdentifierArtist: artist = item.value as? String case AVMetadataIdentifier.commonIdentifierAlbumName: albumName = item.value as? String case AVMetadataIdentifier.commonIdentifierArtwork: if let artworkData = item.value as? Data { albumArtwork = UIImage(data: artworkData) } default: continue } } // 这里就可以拿到解析后的元数据,更新你的UITableView了 print("艺术家:\(artist ?? "未知")") print("专辑:\(albumName ?? "未知")") // albumArtwork就是专辑封面图片,可以直接显示在UIImageView里 case .failed, .cancelled: print("元数据加载失败") default: break } } }
二、获取Documents目录下文件的通用元数据(创建时间、大小等)
如果要获取文件本身的系统元数据(比如创建时间、文件大小、修改时间),用FileManager就能搞定:
let filePath = mp3FileURL.path do { let attributes = try FileManager.default.attributesOfItem(atPath: filePath) // 文件大小(字节) if let fileSize = attributes[.size] as? Int64 { print("文件大小:\(fileSize) 字节") } // 创建时间 if let creationDate = attributes[.creationDate] as? Date { print("创建时间:\(creationDate)") } // 修改时间 if let modificationDate = attributes[.modificationDate] as? Date { print("修改时间:\(modificationDate)") } // 文件类型 if let fileType = attributes[.type] as? String { print("文件类型:\(fileType)") } } catch { print("获取文件属性失败:\(error.localizedDescription)") }
一些注意点
- iOS 11中访问Documents目录不需要额外的隐私权限,因为这是应用的沙盒目录,完全可控
- 解析专辑封面时,有些MP3可能没有嵌入封面,要做好
nil处理,避免闪退 - 如果需要批量处理多个MP3文件,建议把元数据解析逻辑封装成工具类,代码更整洁
内容的提问来源于stack exchange,提问作者user8914795
相关产品推荐
相关产品推荐

