От новичка до гуру: Курсы программирования на CyberDuff

Невозможно редактировать метаданные фотографий с помощью AssetsLibrary в iOS 8.3 (работало в 8.2)

Мое приложение делает снимки, сохраняет их в фотопленку и позволяет изменять метаданные 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

Кто-нибудь знает об исправлении этого?

Спасибо,


  • пожалуйста, поделитесь URL-адресом отчета об ошибке с Apple. Я тоже получаю аналогичную проблему. Я могу получить доступ к активу из массива, используя enumerateAssetsUsingBlock. Но когда я использую assetsForURL (только в ios8.3), я получаю нулевой актив. 27.05.2015
  • Не знаю, как поделиться URL-адресом ошибки, номер ошибки: 20552205. 28.05.2015

Новые материалы

ИИ меняет этику в руководстве
Связь искусственного интеллекта, лидерства и этики Сострадание, глубокое понимание чужих страданий в сочетании с желанием облегчить их, возвышается как неотъемлемая человеческая добродетель...

Представляем Narwhal Technologies (Nrwl)
6 декабря 2016 г. Маунтин-Вью, Калифорния С тех пор, как Виктор Савкин и я (Джефф Кросс) присоединились к команде Angular в Google на заре Angular 1, Angular продемонстрировал феноменальный..

Путь AWS  — «Изучение машинного обучения — 10 начинающих ИИ и машинного обучения на AWS».
Универсальный ресурсный центр для изучения искусственного интеллекта и машинного обучения. НОЛЬ или ГЕРОЙ, начните свое путешествие здесь. Получите решения и пройдите обучение у экспертов AWS...

5 простых концепций Python, ставших сложными
#заранее извините 1) Переменные x = 4 y = 5 Переменная в Python — это символическое представление объекта. После присвоения некоторого объекта переменной Python мы приобретаем..

«Освоение вероятности: изучение совместной, предельной, условной вероятности и теоремы Байеса —…
Виды вероятности: Совместная вероятность Предельная вероятность Условная вероятность Диаграмма Венна в вероятностях: В “Set Theory” мы создаем диаграмму Венна...

Основы Spring: Bean-компоненты, контейнер и внедрение зависимостей
Как лего может помочь нашему пониманию Когда мы начинаем использовать Spring, нам бросают много терминов, и может быть трудно понять, что они все означают. Итак, мы разберем основы и будем..

Отслеживание состояния с течением времени с дифференцированием снимков
Время от времени что-то происходит и революционизирует часть моего рабочего процесса разработки. Что-то более забавное вместо типичного утомительного и утомительного процесса разработки. В..