iOS真机获取Mac文件属性报错,模拟器正常求解决方案
问题解决思路
核心问题很明确:iOS真机的文件系统和Mac完全独立,你不能直接用Mac的文件路径在真机上调用FileManager获取属性——模拟器能正常工作是因为它共享了Mac的文件系统,相当于直接在Mac上跑代码,自然能访问到本地文件,但真机做不到这一点。
正确解决方案
不要让iOS端去读取Mac的文件属性,而是在Mac端的服务器程序里提前获取好每个文件的大小、创建日期,把这些属性和文件名、访问路径一起返回给iOS客户端,iOS端直接用返回的数据展示即可。
具体步骤
Mac端服务器处理文件属性
在Mac端遍历文件列表时,同步获取每个文件的属性,比如用你写的那个URL扩展(因为是在Mac上运行,能正常访问本地文件):// Mac端服务器代码示例 struct FileInfo: Codable { let fileName: String let relativePath: String // 供iOS端请求文件用的路径,比如"Desktop/My office stuff/office-decor.jpg" let fileSizeString: String let creationDate: Date } func getFileList() -> [FileInfo] { let baseURL = URL(fileURLWithPath: "/Users/username/") let desktopURL = baseURL.appendingPathComponent("Desktop") guard let files = try? FileManager.default.contentsOfDirectory(at: desktopURL, includingPropertiesForKeys: [.sizeKey, .creationDateKey]) else { return [] } return files.compactMap { fileURL in let fileName = fileURL.lastPathComponent let relativePath = fileURL.path.replacingOccurrences(of: baseURL.path, with: "") let fileSizeString = fileURL.fileSizeString let creationDate = fileURL.creationDate ?? Date() return FileInfo(fileName: fileName, relativePath: relativePath, fileSizeString: fileSizeString, creationDate: creationDate) } }然后把
[FileInfo]序列化为JSON,返回给iOS客户端。iOS端直接使用返回的属性
iOS端接收到服务器返回的JSON后,解析成对应的模型,直接用模型里的属性展示,不需要再调用FileManager:// iOS端模型示例 struct FileInfo: Codable { let fileName: String let relativePath: String let fileSizeString: String let creationDate: Date } // 解析后直接使用 func displayFile(_ info: FileInfo) { fileNameLabel.text = info.fileName fileSizeLabel.text = info.fileSizeString dateLabel.text = DateFormatter.localizedString(from: info.creationDate, dateStyle: .medium, timeStyle: .short) }
为什么之前的尝试无效?
不管你在iOS端加file://前缀,还是用URL(filePath:)/URL(fileURLWithPath:),本质都是让iOS的FileManager去访问自己设备的本地文件系统,而真机上根本没有/Users/username/Desktop/...这样的路径,所以必然报错。
内容的提问来源于stack exchange,提问作者Mc.Lover
相关产品推荐
相关产品推荐

