Error de PHAssetChangeRequest para UIImage tomado con la camera

Tengo un problema al implementar una camera View Controller para una aplicación iOS en la que estoy trabajando. Cuando presiono un button, tengo un object de camera singleton que gestiona el lado AVFoundation de las cosas y captura la image. Como se puede ver a continuación, una vez que el UIImage se captura desde la camera, paso un bloque de finalización que lo utiliza.

El primer método a continuación es una acción que se dispara cuando se presiona el button de captura en la camera. Primero, la capa de la camera se detiene al deshabilitar la connection en la capa de vista previa, luego se captura la image. Luego, el object de la camera captura el UIImage , momento en el que UIImageView capa de vista previa de la camera de la vista y, en su lugar, agrego una UIImageView con la image capturada en su lugar.

A continuación, quiero agregar la image al álbum que he creado en Fotos utilizando el marco de fotos. Puedo crear el álbum sin problemas, y he verificado que el object PHAssetCollection . Estoy usando en el segundo método es el correcto.

Por alguna razón, sin embargo, no puedo agregar el UIImage que capture al álbum. Traté de agregar al file un file de image aleatorio que tenía en mi proyecto, y la operación se completó con éxito. También he verificado que la image correcta se pasa addPhotoToSavedPhotos método addPhotoToSavedPhotos mediante el uso de instrucciones NSLog para verificar la descripción de la image en ambos methods. Esto me lleva a creer que algo está mal con la image de alguna manera, pero el ImageView lo muestra con éxito, así que no estoy seguro de qué podría ser.

Si alguien tiene alguna idea de soluciones que podría intentar, lo agradecería. También el error.localizedDescription de la instrucción NSLog en el segundo método NSLog "The operation couldn't be completed (Cocoa error -1)".

 - (IBAction)capturePhoto:(id)sender { [self pauseCameraLayer]; [[eventCamera shanetworkingInstance] captureStillUIImage:^(UIImage *image, NSError *error){ if(error) { NSLog(@"error capturing photo"); } else { NSLog(@"%@",image.debugDescription); } [_captureButton setHidden:YES]; [_switchCameraButton setHidden:YES]; UIImageView *preview=[[UIImageView alloc] initWithImage:image]; [preview setAutoresizesSubviews:YES]; [preview setContentMode:UIViewContentModeScaleAspectFit]; [preview setTransform:CGAffineTransformMakeRotation(M_PI_2)]; preview.frame=_imageView.bounds; [_imageView addSubview:preview]; [self addPhotoToSavedPhotos:[image copy]]; NSLog(@"1: %@",image.description); }]; -(void)addPhotoToSavedPhotos:(UIImage*)photo { PHAssetCollection *myCollection=[self getAPPCollection]; [[PHPhotoLibrary shanetworkingPhotoLibrary] performChanges:^{ //Perform changes to photo library PHAssetChangeRequest *req=[PHAssetChangeRequest creationRequestForAssetFromImage:photo]; PHAssetCollectionChangeRequest *assetChangeRequest=[PHAssetCollectionChangeRequest changeRequestForAssetCollection:myCollection]; [assetChangeRequest addAssets:[NSArray arrayWithObject:req.placeholderForCreatedAsset]]; //[libReq addAssets:@[assetPlaceHolder]]; }completionHandler:^(BOOL success, NSError *error){ //Perform any necessary actions after adding the photo to the photo //library if(!success) { NSLog(@"didn't succeed, error: %@",error.localizedDescription); } }]; } 

Prueba algo como esto Este código comprobará si hay un álbum Existente o no primero

  #import <Photos/Photos.h> - (void)addPhotoToSavedPhotos:(UIImage *)image { NSString *albumName = @"NameOFTheAlbum"; void (^saveBlock)(PHAssetCollection *assetCollection) = ^void(PHAssetCollection *assetCollection) { [[PHPhotoLibrary shanetworkingPhotoLibrary] performChanges:^{ PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image]; PHAssetCollectionChangeRequest *assetCollectionChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection]; [assetCollectionChangeRequest addAssets:@[[assetChangeRequest placeholderForCreatedAsset]]]; } completionHandler:^(BOOL success, NSError *error) { if (!success) { NSLog(@"Error creating asset: %@", error); } }]; }; PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init]; fetchOptions.pnetworkingicate = [NSPnetworkingicate pnetworkingicateWithFormat:@"localizedTitle = %@", albumName]; PHFetchResult *fetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:fetchOptions]; if (fetchResult.count > 0) { saveBlock(fetchResult.firstObject); } else { __block PHObjectPlaceholder *albumPlaceholder; [[PHPhotoLibrary shanetworkingPhotoLibrary] performChanges:^{ PHAssetCollectionChangeRequest *changeRequest = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:albumName]; albumPlaceholder = changeRequest.placeholderForCreatedAssetCollection; } completionHandler:^(BOOL success, NSError *error) { if (success) { PHFetchResult *fetchResult = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[albumPlaceholder.localIdentifier] options:nil]; if (fetchResult.count > 0) { saveBlock(fetchResult.firstObject); } } else { NSLog(@"Error creating album: %@", error); } }]; } } 

PHAssetChangeRequest muestra un cuadro de dialog de permissions. La interfaz de usuario debe estar siempre en el hilo principal.

Intente mover el PHAssetChangeRequest fuera de la callback.