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

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)
}

额外注意事项

  1. 权限配置:确保你在Info.plist中添加了NSPhotoLibraryUsageDescription,清晰描述App访问相册的用途,权限缺失也可能导致选择流程异常。
  2. iOS 14+优化方案:如果你的App支持iOS 14及以上版本,推荐使用PHPickerViewController——这是苹果推出的新一代媒体选择器,更灵活高效,还能规避UIImagePickerController的诸多旧问题。

内容的提问来源于stack exchange,提问作者mohit.dnb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:40:44