UIImagePicker选取图片时info[.imageURL]返回nil但mediaURL正常
问题根因
- 当allowsEditing 设为
true时,系统会对选中的图片做裁剪/编辑处理,此时返回的info字典中默认不会携带原始图片的.imageURL字段 - 即使allowsEditing 为
false,部分iOS版本下本地已同步的相册图片也不会主动返回.imageURL,该字段更多用于未缓存在本地的iCloud原图临时下载链接场景
解决方案
方案1:关闭编辑模式直接获取(无需编辑图片的场景)
将ImagePicker初始化时的allowsEditing参数设为false,即可在多数场景下直接拿到.imageURL:
let picker = ImagePicker(mediaTypes: type, allowsEditing: false)
方案2:通过PHAsset获取本地图片URL(支持编辑模式,兼容性最好)
首先导入Photos框架,在代理回调中先获取PHAsset实例,再通过实例请求图片URL,该方式兼容所有iOS 11+版本:
import Photos func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { picker.dismiss(animated: true) // 优先获取PHAsset实例 guard let asset = info[.phAsset] as? PHAsset else { return } // 异步请求图片URL asset.requestContentEditingInput(with: nil) { input, info in guard let imageURL = input?.fullSizeImageURL else { return } // 此处拿到的是原始图片的本地URL print(imageURL) } }
注意:使用PHAsset需要确保App已经申请相册访问权限,需在Info.plist中配置
NSPhotoLibraryUsageDescription字段说明访问用途。
补充:获取编辑后的图片URL
如果需要拿到编辑处理后的图片URL,可以先取出编辑后的UIImage,写入沙盒临时目录生成自定义URL:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { picker.dismiss(animated: true) guard let editedImage = info[.editedImage] as? UIImage else { return } // 生成临时文件路径 let tempPath = NSTemporaryDirectory().appending("\(UUID().uuidString).jpg") let tempURL = URL(fileURLWithPath: tempPath) // 写入图片数据到临时路径 try? editedImage.jpegData(compressionQuality: 0.9)?.write(to: tempURL) // 此处tempURL即为编辑后的图片URL print(tempURL) }
内容的提问来源于stack exchange,提问作者Trev347
相关产品推荐
相关产品推荐

