切换到视频捕获模式后,如何修复UIImagePickerController崩溃? [英] How to fix UIImagePickerController crash after switching to video capture mode?

查看:114
本文介绍了切换到视频捕获模式后,如何修复UIImagePickerController崩溃?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

切换到视频捕获模式后,我在iPhone XR(iOS 12.4.1)真实设备上使用UIImagePickerController崩溃.崩溃在UIImagePickerController的第二次演示中重现.无法在iPhone 6(iOS 12.4.1)真实设备上重现崩溃.相机和麦克风的使用描述键在Info.plist中设置测试使用Xcode 10.3构建的应用

I have a crash with UIImagePickerController on iPhone XR(iOS 12.4.1) real device after switching to video capture mode. Crash reproduces on the second presentation of UIImagePickerController. Crash does not reproduce on iPhone 6(iOS 12.4.1) real device. Camera and Microphone usage description keys are set in Info.plist Test app built with Xcode 10.3

步骤:

  1. 当前的UIImagePickerController
  2. 关闭UIImagePickerController
  3. 当前的UIImagePickerController
  4. 点击视频按钮->崩溃

如果我设置 videoQuality = UIImagePickerControllerQualityTypeHigh ,崩溃不会重现.但是我需要 UIImagePickerControllerQualityTypeMedium .

Crash does not reproduce if I set videoQuality = UIImagePickerControllerQualityTypeHigh. But I need UIImagePickerControllerQualityTypeMedium.

@interface ViewController () < UINavigationControllerDelegate, UIImagePickerControllerDelegate>
@end

@implementation ViewController

#pragma mark - IBActions

- (IBAction)showPicker:(UIButton *)sender {
    UIImagePickerController *pickerController = [UIImagePickerController new];
    pickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
    pickerController.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
//    pickerController.videoQuality = UIImagePickerControllerQualityTypeHigh;
    pickerController.delegate = self;

    [self presentViewController:pickerController animated:YES completion:NULL];
}

#pragma mark - UIImagePickerControllerDelegate

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey, id> *)info {
    [self dismissViewControllerAnimated:YES completion:NULL];
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    [self dismissViewControllerAnimated:YES completion:NULL];
}

@end

'NSInvalidArgumentException', reason: '*** -[AVCaptureDevice setActiveColorSpace:] Not supported - use activeFormat.supportedColorSpaces'

推荐答案

我提出了一种替代方法,它替换了不受支持的色彩空间.

I made a workaround which replaces unsupported color spaces.

private extension AVCaptureDevice {
    
    static let configureRandomCrashWorkaround: Void = {
        swizzleInstanceMethod(
            class: AVCaptureDevice.self,
            originalSelector: #selector(setter: AVCaptureDevice.activeColorSpace),
            swizzledSelector: #selector(AVCaptureDevice.kjy_swizzle_setActiveColorSpace)
        )
    }()
    
    @objc func kjy_swizzle_setActiveColorSpace(_ colorSpace: AVCaptureColorSpace) {
        var colorSpace = colorSpace
        let supportedColorSpaces = activeFormat.supportedColorSpaces
        
        if !supportedColorSpaces.isEmpty,
           !supportedColorSpaces.contains(colorSpace)
        {
            // prevent a crash on UIImagePickerControllerInfoKey/Camera: "Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: -[AVCaptureDevice setActiveColorSpace:] Not supported - use activeFormat.supportedColorSpaces"
            colorSpace = activeFormat.supportedColorSpaces[0]
        }
        kjy_swizzle_setActiveColorSpace(colorSpace)
    }
}

这篇关于切换到视频捕获模式后,如何修复UIImagePickerController崩溃?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆