UIImagePickerController相册正常但相机报exposureBiasesByMode错误如何解决
错误产生原因
- 该
exposureBiasesByMode相关报错绝大多数是iOS 15及以上版本的系统内部日志冗余,本身不会导致功能崩溃,如果相机只是打印该报错但可以正常使用,属于正常现象。 - 如果伴随报错相机完全无法启动,常见原因有两个:
- 项目Info.plist缺少相机权限声明
NSCameraUsageDescription,系统直接拒绝相机访问触发错误。 - 全局复用同一个
UIImagePickerController实例,在相册和相机之间切换sourceType时,系统内部相机参数没有正确重置,导致读取曝光配置失败。
- 项目Info.plist缺少相机权限声明
修复方案
方案1:补全权限配置
在项目Info.plist中添加相机权限声明,右键Info.plist选择Open As -> Source Code,添加如下代码:<key>NSCameraUsageDescription</key> <string>需要访问您的相机拍摄照片</string>也可以在可视化界面添加
Privacy - Camera Usage Description项,值填写自定义的权限提示文案即可。方案2:不复用UIImagePickerController实例
修改ImagePicker类逻辑,每次调用对应功能时重新初始化picker,避免切换来源时的参数冲突:open class ImagePicker: NSObject { private weak var presentationController: UIViewController? private weak var delegate: ImagePickerDelegate? // 临时持有当前使用的picker避免提前释放 private var currentPicker: UIImagePickerController? public init(presentationController: UIViewController, delegate: ImagePickerDelegate) { super.init() self.presentationController = presentationController self.delegate = delegate } private func action(for type: UIImagePickerController.SourceType, title: String) -> UIAlertAction? { guard UIImagePickerController.isSourceTypeAvailable(type) else { return nil } return UIAlertAction(title: title, style: .default) { [unowned self] _ in let picker = UIImagePickerController() picker.delegate = self picker.allowsEditing = true picker.mediaTypes = ["public.image"] picker.sourceType = type self.currentPicker = picker self.presentationController?.present(picker, animated: true) } } func openCamera() { guard UIImagePickerController.isSourceTypeAvailable(.camera) else { return } let picker = UIImagePickerController() picker.delegate = self picker.allowsEditing = true picker.mediaTypes = ["public.image"] picker.sourceType = .camera currentPicker = picker presentationController?.present(picker, animated: true) } func openPhotoLibrary() { guard UIImagePickerController.isSourceTypeAvailable(.photoLibrary) else { return } let picker = UIImagePickerController() picker.delegate = self picker.allowsEditing = true picker.mediaTypes = ["public.image"] picker.sourceType = .photoLibrary currentPicker = picker presentationController?.present(picker, animated: true) } public func present(from sourceView: UIView) { // 原有逻辑保持不变 } private func pickerController(_ controller: UIImagePickerController, didSelect image: UIImage?) { controller.dismiss(animated: true, completion: nil) self.delegate?.didSelect(image: image) // 用完释放picker self.currentPicker = nil } } extension ImagePicker: UIImagePickerControllerDelegate, UINavigationControllerDelegate { // 原有代理逻辑保持不变 }方案3:忽略系统日志
如果相机功能完全正常,仅控制台打印该报错,可以直接忽略,属于iOS系统内部的打印bug,不会影响App功能和上架审核。
内容的提问来源于stack exchange,提问作者Jitendra Modi
相关产品推荐
相关产品推荐

