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

iOS应用中通过IBAction调用原生相机:求正确URL Scheme

如何在iOS应用中打开原生相机应用

嘿,这个问题其实挺常见的——苹果并没有提供公开的URL Scheme来直接跳转原生相机应用哦。像sms:、tel:这类是苹果官方公开的Scheme,但相机应用并没有对应的公开跳转地址,而且就算你找到一些非公开的私有Scheme,也绝对不建议用:一来会被App Store审核拒绝,二来系统版本更新后很可能直接失效。

那正确的做法是什么呢?苹果提供了官方的组件来让你在应用内调用相机,下面是两种常用的实现方式:

1. 使用UIImagePickerController(UIKit)

这是传统的方式,适用于所有支持UIKit的iOS版本:

首先,确保你的ViewController遵循UIImagePickerControllerDelegate和UINavigationControllerDelegate协议,然后添加以下代码:

import UIKit

class YourViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    
    func openCamera() {
        guard UIImagePickerController.isSourceTypeAvailable(.camera) else {
            // 处理设备没有相机的情况,比如iPad模拟器
            print("相机不可用")
            return
        }
        
        let picker = UIImagePickerController()
        picker.sourceType = .camera
        picker.delegate = self
        present(picker, animated: true)
    }
    
    // 实现代理方法获取拍摄的照片
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        picker.dismiss(animated: true)
        
        if let image = info[.originalImage] as? UIImage {
            // 处理拍摄得到的图片
            print("成功获取照片")
        }
    }
    
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true)
    }
}

重要提醒:别忘了在Info.plist中添加相机权限描述,否则应用会崩溃:

<key>NSCameraUsageDescription</key>
<string>需要访问相机来拍摄照片</string>

2. 使用PHPickerViewController(iOS 14+)

如果你只需要支持iOS 14及以上版本,苹果更推荐使用PHPickerViewController,它是Photos框架提供的组件,权限控制更严格,也更符合现代iOS的设计:

import PhotosUI

class YourViewController: UIViewController, PHPickerViewControllerDelegate {
    
    func openCameraWithPHPicker() {
        var configuration = PHPickerConfiguration()
        configuration.filter = .images // 只允许选择图片
        configuration.preferredAssetRepresentationMode = .current
        configuration.selectionLimit = 1
        
        let picker = PHPickerViewController(configuration: configuration)
        picker.delegate = self
        present(picker, animated: true)
    }
    
    func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
        picker.dismiss(animated: true)
        
        guard let result = results.first else { return }
        
        if result.itemProvider.canLoadObject(ofClass: UIImage.self) {
            result.itemProvider.loadObject(ofClass: UIImage.self) { image, error in
                DispatchQueue.main.async {
                    if let image = image as? UIImage {
                        // 处理图片
                        print("成功获取照片")
                    }
                }
            }
        }
    }
}

这种方式下,当用户选择用相机拍摄时,系统会自动弹出权限请求,但你仍需要在Info.plist中添加NSCameraUsageDescription来描述权限用途。

总结一下:别再找相机的URL Scheme了,用苹果官方提供的这两种组件才是合规、稳定的解决方案~

内容的提问来源于stack exchange,提问作者Theo Strauss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:41:28