iOS 13.7中UIImagePickerController回调移动文件提示无权限问题
解决UIImagePickerController移动文件权限问题(iOS 13.7+)
这个问题我之前也碰到过,本质是iOS 13.5之后苹果对UIImagePickerController返回的媒体文件权限做了调整——之前mediaURL指向的文件可以直接移动,但在iOS 13.7及以上,这个URL对应的文件属于系统管理的临时容器,你的App没有权限将其移动到自己的沙盒目录,只能通过复制的方式获取文件。
问题根源
在iOS 13.5中,mediaURL返回的是App沙盒内的临时文件,App拥有完整的读写权限;但iOS 13.7开始,这个文件被放在了系统专属的临时区域,App只有只读权限,无法执行移动操作(移动需要对源文件所在目录有写入权限,而系统容器你没有这个权限)。
修复方案
把moveItem(at:to:)替换成copyItem(at:to:)即可,复制操作只需要源文件的读取权限,而App是拥有这个权限的。修改后的代理方法代码如下:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { guard let videoURL = info[.mediaURL] as? URL else { return } do { let newFileLocation = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString + ".mov") // 替换move为copy,解决权限问题 try FileManager.default.copyItem(at: videoURL, to: newFileLocation) // 这里可以继续处理新复制的文件 } catch { print("文件处理失败:\(error.localizedDescription)") } picker.dismiss(animated: true) }
额外说明
- 系统会自动清理
mediaURL指向的临时文件,所以你不需要手动删除源文件,专注处理自己复制后的文件即可。 - 如果你的业务确实需要节省磁盘空间,也可以尝试复制完成后删除源文件,但需要注意:删除源文件可能会因为权限问题失败,所以更稳妥的方式是只保留复制后的文件。
内容的提问来源于stack exchange,提问作者joel.d
相关产品推荐
相关产品推荐

