Question UIImagePickerControllerOriginalImage néant provoquant un plantage lors de la capture de photos


J'ai un crash dans plusieurs versions de mes applications, et il semble que cela ait commencé sur iOS8. Je ne le ressens que par des rapports de panne et je ne peux pas le reproduire sur mes appareils de test. Cela semble être le cas lorsqu'un utilisateur capture une image (ou la sélectionne dans la bibliothèque?) Et que l'image d'origine ne peut pas être définie car l'image est nulle. Le problème le plus proche que je puisse trouver lors de la recherche est le suivant:

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

Une autre possibilité est quand il est en arrière-plan avec un timing de condition de course spécifique, que je ne peux pas non plus reproduire.

http://openradar.appspot.com/19953748

mais je ne pense pas que mon erreur provient d'une image de flux sélectionnée. J'espère voir si quelqu'un d'autre obtient cette erreur, et a soit trouvé une solution pour attraper systématiquement l'exception, ou détecter quand cela se produit, ou désactiver une action utilisateur spécifique (comme l'arrière-plan de l'application tout en téléchargeant des photos) pour éviter un accident.

Exception fatale: exception NSInvalidArgumentException *** setObjectForKey: l'objet ne peut pas être nul (clé: 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 le 18 sept. 2017 Je n'ai pas revu ce problème et je n'ai pas trouvé de solution, malheureusement :(


11
2018-04-24 00:04


origine


Réponses:


J'ai pu reproduire ce crash exactement à partir du scénario basé dans http://openradar.appspot.com/19953748 . J'ai mis en place une boucle infinie qui a pris une photo toutes les 2 secondes et j'ai continuellement déplacé l'application entre l'arrière-plan et l'avant-plan. Il plante très vite avec la même trace de pile. Bien que je ne sois pas sûr de la cause profonde de cela, je suis capable de le résoudre en vérifiant simplement l'état de l'application avant de prendre la photo

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

3
2018-05-19 21:19



  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];
        }
    }

  }

Ensuite, en méthode délégué,

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

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

0
2018-04-24 05:35