UIImagePickerControllerOriginalImage nil вызывает сбои при захвате фотографий

Я получаю сбой в нескольких версиях моих приложений, и, похоже, он начал происходить на iOS8. Я испытываю это только через отчеты о сбоях и не могу воспроизвести его на своих тестовых устройствах. Кажется, что когда пользователь захватывает изображение (или выбирает его из библиотеки?), И исходное изображение не может быть установлено, потому что изображение равно нулю. Самая близкая проблема, которую я могу найти во время поиска, такова:

https://github.com/B-Sides/ELCImagePickerController/issues/58

Другая возможность заключается в том, что она связана с определенным сроком действия гонки, который я также не могу воспроизвести.

http://openradar.appspot.com/19953748

но я не думаю, что моя ошибка исходит из выбранного потока. Я надеюсь, что если кто-нибудь еще получит эту ошибку, и либо выяснил решение, чтобы последовательно поймать исключение, либо обнаружить, когда это произойдет, либо отключить определенное действие пользователя (например, фоновая настройка приложения при загрузке фотографий), чтобы избежать крушение.

Фатальное исключение: исключение NSInvalidArgumentException *** setObjectForKey: объект не может быть nil (ключ: UIImagePickerControllerOriginalImage)

Thread : Fatal Exception: NSInvalidArgumentException
0  CoreFoundation                 0x2b381fef __exceptionPreprocess + 126
1  libobjc.A.dylib                0x39633c8b objc_exception_throw + 38
2  CoreFoundation                 0x2b29daa3 -[__NSDictionaryM setObject:forKey:] + 850
3  PhotoLibrary                   0x345bf8f3 __CreateInfoForImage
4  PhotoLibrary                   0x345bf1ad PLNotifyImagePickerOfImageAvailability
5  PhotoLibrary                   0x345d384b -[PLUICameraViewController cameraView:photoSaved:]
6  PhotoLibrary                   0x34606a73 -[PLImagePickerCameraView cropOverlay:didFinishSaving:]
7  PhotoLibrary                   0x3460706d -[PLImagePickerCameraView captureController:didCompleteResponse:forStillImageRequest:error:]
8  CameraKit                      0x303392a5 -[CAMCaptureController _completedResponse:forRequest:error:]
9  CameraKit                      0x30338bfb __56-[CAMCaptureController enqueueStillImageCaptureRequest:]_block_invoke_32160
10 libdispatch.dylib              0x39b9e2e3 _dispatch_call_block_and_release + 10
11 libdispatch.dylib              0x39b9e2cf _dispatch_client_callout + 22
12 libdispatch.dylib              0x39ba1d2f _dispatch_main_queue_callback_4CF + 1330
13 CoreFoundation                 0x2b347609 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 8
14 CoreFoundation                 0x2b345d09 __CFRunLoopRun + 1512
15 CoreFoundation                 0x2b292201 CFRunLoopRunSpecific + 476
16 CoreFoundation                 0x2b292013 CFRunLoopRunInMode + 106
17 GraphicsServices               0x32b71201 GSEventRunModal + 136
18 UIKit                          0x2ea36a59 UIApplicationMain + 1440
19 Pact                           0x000b26ab main (main.m:17)
20 libdyld.dylib                  0x39bbfaaf start + 2

EDIT 18 сентября 2017 года. Я не пересматривал эту проблему и не нашел решения, к сожалению: (

Ответ 1

Я смог воспроизвести этот сбой именно из сценария, основанного на http://openradar.appspot.com/19953748. Я установил бесконечный цикл, который делал снимок каждые 2 секунды, и я постоянно перемещал приложение между фоном и передним планом. Он очень быстро падает с той же трассировкой стека. Хотя я не уверен в первопричине этого, я могу решить его, просто проверив состояние приложения, прежде чем делать снимок

//Swift
if UIApplication.sharedApplication().applicationState == .Active {
                // Take picture
} 

Ответ 2

  If you write tap gesture or action sheet,just check the below code with your code. 

 -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
  {
     UIImagePickerController *pickerController = [[UIImagePickerController alloc]init];
     pickerController.delegate=self;
     if(buttonIndex==0)
     {
         pickerController.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
         [self presentViewController:pickerController animated:YES completion:nil];
     }
     else if(buttonIndex==1)
     {
         if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] == YES)
        {
            NSLog(@"Camera is available and ready");
            pickerController.sourceType=UIImagePickerControllerSourceTypeCamera;
            [self presentViewController:pickerController animated:YES completion:nil];
        }
        else
        {
            NSLog(@"Camera is not available");
            [[[UIAlertView alloc]initWithTitle:@"Whoa !" message:@"Camera is not available" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]show];
        }
    }

  }

Затем в методе делегата

   -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
   {

       UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
       imageView.image = image;
       [picker dismissViewControllerAnimated:YES completion:nil];
   }