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

如何让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中拆分两种场景处理:
    1. 相册图片通过PHAsset请求编辑输入,拿到原始文件URL获取扩展名。
    2. 相机拍摄的图片直接从info[.imageURL]提取URL,判断扩展名。
  • 错误提示采用UIAlertController实现,符合iOS原生交互规范。

内容的提问来源于stack exchange,提问作者Ghayda Yahia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 05:07:38