iOS中从图片选择器获取视频URL遇异常求助
解决UIImagePickerController选择视频时自动压缩且无法关闭的问题
你遇到的核心问题在于错误使用了已弃用的URL获取方式,导致系统触发了不必要的媒体资源加载,进而引发自动压缩和选择器卡住无法关闭的情况。下面是具体分析和修复方案:
问题根源
你在代理方法中用了UIImagePickerControllerReferenceURL来获取视频URL,这个字段在iOS 11之后就被弃用了。它指向的是Photos库中资源的引用路径,获取该URL需要额外的媒体库权限和资源加载操作,系统会自动尝试处理原始视频(包括压缩),这就导致了选择器无法正常回调关闭的现象。
修复方案
改用UIImagePickerControllerMediaURL获取视频的临时文件URL,这是系统提供的正确方式——它会直接返回选择后视频的临时副本路径,不会触发不必要的压缩或资源加载,能让选择器正常回调并关闭。
修正后的完整代码
首先确保导入必要框架:
import UIKit import MobileCoreServices // 用于媒体类型常量
初始化并present选择器的代码可保留,建议更新mediaTypes写法以适配新版本:
self.imagePickerController.sourceType = .savedPhotosAlbum self.imagePickerController.delegate = self // 适配iOS 14+的写法,兼容旧版本也可以用`kUTTypeMovie as String` self.imagePickerController.mediaTypes = [UTType.movie.identifier] self.present(self.imagePickerController, animated: true, completion: nil)
然后更新代理方法(同步Swift语法规范,使用新版InfoKey):
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { // 获取视频临时文件URL if let videoURL = info[.mediaURL] as? URL { print("选中的视频URL: \(videoURL)") // 在这里添加你的视频处理逻辑,比如复制到沙盒、上传等 } // 关闭选择器,务必使用传入的picker实例,避免实例不一致问题 picker.dismiss(animated: true, completion: nil) } // 别忘了实现取消选择的代理方法,保证用户取消时选择器也能正常关闭 func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { picker.dismiss(animated: true, completion: nil) }
额外注意事项
- 权限配置:确保你在
Info.plist中添加了NSPhotoLibraryUsageDescription,清晰描述App访问相册的用途,权限缺失也可能导致选择流程异常。 - iOS 14+优化方案:如果你的App支持iOS 14及以上版本,推荐使用
PHPickerViewController——这是苹果推出的新一代媒体选择器,更灵活高效,还能规避UIImagePickerController的诸多旧问题。
内容的提问来源于stack exchange,提问作者mohit.dnb
相关产品推荐
相关产品推荐

