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
相关产品推荐
相关产品推荐

