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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 12:43:15