如何让iOS应用仅接受特定扩展名的图片并显示错误提示?
实现特定图片格式限制的方案
核心思路
通过获取选中图片的文件扩展名,与允许的格式列表对比,不符合则弹出错误提示,符合才加载图片。主要通过PHAsset(相册资源)或imageURL获取文件格式信息,覆盖相机拍摄和相册选择两种场景。
修改后的完整代码
import UIKit import Photos class ViewController: UIViewController { @IBOutlet var imageView: UIImageView! // 定义允许的图片扩展名(统一小写,避免大小写判断误差) private let allowedImageExtensions = ["png", "jpg", "jpeg"] override func viewDidLoad() { super.viewDidLoad() } @IBAction func didTapCamera(){ let picker = UIImagePickerController() picker.sourceType = .camera picker.allowsEditing = true picker.delegate = self present(picker, animated: true) } @IBAction func didTapButton(){ let picker = UIImagePickerController() picker.sourceType = .photoLibrary picker.delegate = self picker.allowsEditing = true present(picker, animated: true) } // 统一处理选择结果的逻辑 private func handleSelectionResult(isAllowed: Bool, image: UIImage?, picker: UIImagePickerController) { picker.dismiss(animated: true) { [weak self] in guard let self = self else { return } if isAllowed, let validImage = image { self.imageView.image = validImage } else { let alert = UIAlertController(title: "格式不支持", message: "仅可选择PNG、JPG/JPEG格式的图片", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) self.present(alert, animated: true) } } } } extension ViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate{ func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { var isFormatAllowed = false var targetImage: UIImage? // 处理相册选择的资源:通过PHAsset获取原始文件信息 if let asset = info[.phAsset] as? PHAsset { let requestOptions = PHContentEditingInputRequestOptions() requestOptions.canHandleAdjustmentData = { _ in true } asset.requestContentEditingInput(with: requestOptions) { [weak self] editingInput, _ in guard let self = self, let input = editingInput, let imageURL = input.fullSizeImageURL else { self?.handleSelectionResult(isAllowed: false, image: nil, picker: picker) return } let fileExtension = imageURL.pathExtension.lowercased() if self.allowedImageExtensions.contains(fileExtension) { isFormatAllowed = true // 优先取编辑后的图片,无编辑则取原始图 targetImage = info[.editedImage] as? UIImage ?? info[.originalImage] as? UIImage } self.handleSelectionResult(isAllowed: isFormatAllowed, image: targetImage, picker: picker) } } // 处理相机拍摄或直接返回URL的场景 else if let imageURL = info[.imageURL] as? URL { let fileExtension = imageURL.pathExtension.lowercased() isFormatAllowed = allowedImageExtensions.contains(fileExtension) targetImage = info[.editedImage] as? UIImage ?? info[.originalImage] as? UIImage handleSelectionResult(isAllowed: isFormatAllowed, image: targetImage, picker: picker) } // 无法获取文件信息的情况,默认判定为不合法 else { handleSelectionResult(isAllowed: false, image: nil, picker: picker) } } func imagePickerControllerDidCancel(_ picker: UIImagePickerController){ picker.dismiss(animated: true, completion: nil) } }
关键改动说明
- 新增
allowedImageExtensions数组,明确允许的图片格式,统一用小写避免大小写判断问题。 - 新增
handleSelectionResult方法,集中处理格式验证后的逻辑:合法则加载图片,不合法则弹出原生错误提示。 - 在
didFinishPickingMediaWithInfo中拆分两种场景处理:- 相册图片通过
PHAsset请求编辑输入,拿到原始文件URL获取扩展名。 - 相机拍摄的图片直接从
info[.imageURL]提取URL,判断扩展名。
- 相册图片通过
- 错误提示采用
UIAlertController实现,符合iOS原生交互规范。
内容的提问来源于stack exchange,提问作者Ghayda Yahia
相关产品推荐
相关产品推荐

