问题
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:
- Present UIImagePickerController
- Dismiss UIImagePickerController
- Present UIImagePickerController
- 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'
回答1:
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)
}
}
来源:https://stackoverflow.com/questions/57869899/how-to-fix-uiimagepickercontroller-crash-after-switching-to-video-capture-mode