Мое приложение делает снимки, сохраняет их в фотопленку и позволяет изменять метаданные EXIF.
Я использую AssetsLibrary для сохранения и изменения фотографии (я не могу использовать новый API-интерфейс PhotoKit, потому что мне нужно изменить базовый EXIF, плюс это устаревшее приложение, и для его изменения потребуется много рефакторинга).
Я использую Xcode 6.3.1 с SDK iOS 8.3, цель развертывания 6.1.
В iOS 8.2 все это работало.
В iOS 8.3 происходит сбой редактирования метаданных.
Приложение имеет разрешение в настройках конфиденциальности для доступа к фотографиям.
Когда пользователь изменяет фотографии и приложение пытается перезаписать фотографию, в iOS 8.3 теперь отображается диалоговое окно «Разрешить приложению изменять эту фотографию». Это диалоговое окно не появлялось в iOS 8.2. Если я нажму «Изменить», фотография сохранится, но метаданные будут удалены. Также нет ошибки, возвращаемой setImageData, и я проверяю, редактируется ли фотография.
Вот код:
-(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];
}
}
При отладке этого я заметил ошибку в своем коде, из-за которой размер фотографии увеличивался в 4 раза с помощью UIImageJPEGRepresentation, потому что она передискретизировала фотографию, поэтому я изменил код, чтобы получить исходные байты изображения, и просто переписал метаданные. Но что интересно, я получаю другую ошибку, на этот раз setImageData возвращает эту ошибку.
Описание : "Пользователю отказано в доступе".
Основная ошибка: код «ALAssetsLibraryErrorDomain» -3311.
FailureReason: «Пользователь запретил приложению доступ к своему медиафайлу».
Что странно, потому что приложение создало актив и имеет доступ к фотопленке.
Опять же, этот код работает в 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];
}
}
Я отправил отчет об ошибке в Apple, но ничего не услышал.
Это похоже на этот вопрос: setImageData не работает в iOS 8.3
Кто-нибудь знает об исправлении этого?
Спасибо,