No se pueden editar metadatos de fotos con AssetsLibrary en iOS 8.3 (trabajado en 8.2)

Mi aplicación toma fotos, las guarda en el carrete de la cámara y permite la modificación de los metadatos EXIF.

Utilizo AssetsLibrary para guardar y modificar la foto (no puedo usar la nueva API PhotoKit porque necesito modificar el EXIF subyacente, además es una aplicación heredada y requeriría mucha refactorización para cambiarla).

Estoy usando Xcode 6.3.1, con el SDK de iOS 8.3, objetivo de implementación de 6.1.

En iOS 8.2, todo esto funcionó.

En iOS 8.3, la edición de los metadatos falla.

La aplicación tiene permiso en la configuración de Privacidad para acceder a Fotos.

Cuando un usuario modifica las fotos y la aplicación intenta reescribir la foto, iOS 8.3 ahora muestra el cuadro de diálogo "Permitir que la aplicación modifique esta foto". Este cuadro de diálogo no apareció en iOS 8.2. Si hago clic en "Modificar", la foto se guarda, pero los metadatos se borran. Tampoco hay ningún error devuelto por setImageData, y verifico si la foto es editable.

Aquí está el código:

-(void)savePhoto:(ALAsset*)asset
{
    ALAssetRepresentation* rep = [asset defaultRepresentation];
    CGImageRef imageRef = [rep fullResolutionImage];
    UIImage *image = [UIImage imageWithCGImage:imageRef];
    NSData *imageData = UIImageJPEGRepresentation(image, 1.0);

    if ([asset isEditable])
    {
        [asset setImageData:imageData metadata:self.getMetadataDictionary completionBlock:^(NSURL *assetURL, NSError *error)
         {
             if (error!=nil)
                 [self showErrorDialog:error title:@"Error saving photo" ];

             [self closeSaveDialog];
         }];
    }
    else
    {
        [self closeSaveDialog];
        UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"Error saving photo" message:@"Photo is not editable" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alertView show];
    }
}

Al depurar esto, noté un error en mi código donde el tamaño de la foto aumentaba 4 veces por la Representación UIImageJPEG, porque estaba volviendo a muestrear la foto, así que cambié el código para tomar los bytes de la imagen original y simplemente reescribí los metadatos. Pero curiosamente, recibo un error diferente, esta vez setImageData devuelve este error.

Descripción: "Acceso denegado por el usuario".

Error subyacente: Código "ALAssetsLibraryErrorDomain" -3311.

FailureReason: "El usuario ha denegado el acceso de la aplicación a sus medios".

Lo cual es extraño, porque la aplicación creó el activo y tiene acceso al rollo de la cámara.

De nuevo, este código funciona en iOS 8.2:

-(void)savePhoto:(ALAsset*)asset
{
    ALAssetRepresentation* rep = [asset defaultRepresentation];
    // New way handling updating photos, doesn't modify image data at all, only metadata
    Byte *buffer = (Byte*)malloc((unsigned long)rep.size);
    NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:(NSUInteger)rep.size error:nil];
    NSData *imageData = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];
    if ([asset isEditable])
    {
        [asset setImageData:imageData metadata:self.getMetadataDictionary completionBlock:^(NSURL *assetURL, NSError *error)
         {
             if (error!=nil)
                 [self showErrorDialog:error title:@"Error saving photo" ];

             [self closeSaveDialog];
         }];
    }
    else
    {
        [self closeSaveDialog];
        UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"Error saving photo" message:@"Photo is not editable" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alertView show];
    }
}

Envié un informe de error a Apple, pero no escuché nada.

Esto es similar a esta pregunta:setImageData falla en iOS 8.3

¿Alguien sabe de un arreglo para esto?

Gracias,

Respuestas a la pregunta(0)

Su respuesta a la pregunta