简体   繁体   中英

How to fix UIImagePickerController crash after switching to video capture mode?

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

Steps:

  1. Present UIImagePickerController
  2. Dismiss UIImagePickerController
  3. Present UIImagePickerController
  4. Tap VIDEO button - > Crash

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)
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM