Как исправить сбой UIImagePickerController после переключения в режим захвата видео?
У меня возник сбой с UIImagePickerController на реальном устройстве iPhone XR(iOS 12.4.1) после переключения в режим захвата видео. Сбой воспроизводится при второй презентации UIImagePickerController. Сбой не воспроизводится на реальном устройстве iPhone 6(iOS 12.4.1). Ключи описания использования камеры и микрофона задаются в приложении Info.plist Test, созданном с помощью Xcode 10.3.
Шаги:
- Присутствует UIImagePickerController
- Закрыть UIImagePickerController
- Присутствует UIImagePickerController
- Нажмите кнопку ВИДЕО - > Сбой
Сбой не воспроизводится, если я установил videoQuality = UIImagePickerControllerQualityTypeHigh
. Но мне нужно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 ответ
Я сделал обходной путь, который заменяет неподдерживаемые цветовые пространства.
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)
}
}