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

iOS 11中如何获取/Documents目录下文件及MP3的元数据?

在iOS 11中获取Documents目录下MP3的音乐元数据及文件通用元数据

嘿,刚好我之前做过类似的音乐播放器开发,给你分享下具体的实现方案,都是iOS官方框架的用法,在iOS 11上完全适用~

一、获取MP3文件的艺术家、专辑封面等音乐元数据

要提取音乐的专业元数据,AVFoundation是最佳选择,苹果原生支持,能精准解析MP3里的ID3标签信息。步骤如下:

  1. 先导入AVFoundation框架
import AVFoundation
  1. 拼接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)
  1. 异步加载并解析元数据
    元数据读取可能耗时,一定要用异步方式避免卡主线程:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:47:45