4

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'
Artog
  • 1,132
  • 1
  • 13
  • 25
  • You probably found a nice bug. Could you please check what capture session says about support of corresponding presets by including the following line `NSLog(@"Can set medium session preset: %@", [[AVCaptureSession new] canSetSessionPreset: AVCaptureSessionPresetMedium] ? @"true" : @"false");` and importing `AVFoundation`. Does it report it as supported each time or does it fall to "false" the second time? – Matic Oblak Sep 10 '19 at 11:57
  • Matic Oblak, AVCaptureSessionPresetMedium reported as supported both times. – Andrii Tiutiunnyk Sep 10 '19 at 12:28

1 Answers1

0

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)
    }
}
Jonny
  • 1,969
  • 18
  • 25