IOS) Расширение для фотографий не может сохранить изменения

Я делаю расширение для фотографий, но когда пытаюсь сохранить изменения (нажата кнопка «Готово»).

Предупреждающее сообщение «Невозможно сохранить изменения» — «Произошла ошибка при сохранении. Пожалуйста, попробуйте позже.'

Это мой код для finishContentEditingWithCompletionHandler:completionHandler

- (void)finishContentEditingWithCompletionHandler:(void (^)(PHContentEditingOutput *))completionHandler {
    // Update UI to reflect that editing has finished and output is being rendered.

    // Render and provide output on a background queue.
    dispatch_async(dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0), ^{
        // Create editing output from the editing input.
        PHContentEditingOutput *output = [[PHContentEditingOutput alloc] initWithContentEditingInput:self.input];
        NSURL *originalImageURL = self.input.fullSizeImageURL;
        //Apply filter
        CIFilter *appliedFilter = [CIFilter filterWithLUT:self.presetFilterNameArray[self.currentAppliedFilterIndex] originalLUT:@"LUT-ORG-512" dimension:64 alpha:self.filterAlphaSlider.value CIContext:self.ciContext];
        UIImage *filteredOriginalImage = [self filterApply:[UIImage imageWithContentsOfFile:originalImageURL.path] filter:appliedFilter];
        //Apply orientation
        filteredOriginalImage = [UIImage imageWithCGImage:filteredOriginalImage.CGImage scale:filteredOriginalImage.scale orientation:self.input.fullSizeImageOrientation];

        // Provide new adjustments and render output to given location.
        NSData *archiver = [NSKeyedArchiver archivedDataWithRootObject:self.presetFilterNameArray[self.currentAppliedFilterIndex]];
        output.adjustmentData = [[PHAdjustmentData alloc] initWithFormatIdentifier:@"com.fantagram.BetterAndBetter.TKPhotoExtension" formatVersion:@"1.0" data:archiver];

        NSData *renderedJPEGData = UIImageJPEGRepresentation(filteredOriginalImage, 1.0f);
        if([renderedJPEGData writeToURL:output.renderedContentURL atomically:YES]){
            NSLog(@"success to write");
        }
        else{
            NSLog(@"fail to write");
        }

        NSLog(@"%@", output);
        // Call completion handler to commit edit to Photos.
        completionHandler(output);

        // Clean up temporary files, etc.
    });
}

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

Еще кое-что.

Можно ли открыть хост-приложение из расширения фото?

self.extensionContext openURL: не работает (насколько я знаю, это работает только в сегодняшнем расширении.)

UIResponder *responder = self;
        while(responder){
            if([responder respondsToSelector:@selector(openURL:)]){
                dispatch_async(dispatch_get_main_queue(), ^{
                       [responder performSelector:@selector(openURL:) withObject:[NSURL URLWithString:(MY_URL_Schemes)]];     
                });
            }
            responder = [responder nextResponder];
        }

приведенный выше код также не работал. Это сработало, когда я использовал его share extension.

Спасибо.


person TKang    schedule 27.12.2016    source источник
comment
Что касается вашего второго вопроса: он есть в документации, но API-интерфейсы iOS SDK, которые можно использовать из расширения, ограничены. В частности, весь бизнес UIApplication выходит за рамки (это имеет смысл: ваше расширение — это просто общая структура, используемая другим приложением, которому принадлежит sharedInstance из UIApplication). Таким образом, я не думаю, что вы можете запустить приложение-контейнер из расширения.   -  person Nicolas Miari    schedule 16.09.2018
comment
Я создал минимальное приложение на основе примера кода Apple, за исключением того, что оно пытается сохранить исходное изображение без изменений; остальная часть finishContentEditing: такая же, как код Apple. Я зарегистрировал все свойства данных PHContentEditingInput, переданных в начале сеанса редактирования, и вскоре заметил, что сохранение всегда терпит неудачу именно тогда, когда fullSizeImageOrientation имеет значение 6 (также известное как CGImagePropertyOrientation.right), которое каким-то образом применимо ко всем фотографиям, которые я делаю в портретной ориентации. Как только я найду обходной путь или решение, я опубликую. отвечать.   -  person Nicolas Miari    schedule 17.09.2018


Ответы (1)


Попробуйте это,

Перейдите в НАСТРОЙКИ, затем ФОТО И КАМЕРА. Я изменил параметры с «Оптимизировать хранилище iPhone» на «СКАЧАТЬ И СОХРАНИТЬ ОРИГИНАЛЫ».

Я думаю, что обычно при настройке «Оптимизировать» фотографии загружаются обратно в исходное состояние, а затем вам разрешается редактировать.

Надеюсь, это поможет вам.

person KAR    schedule 27.12.2016
comment
Спасибо, но другое опубликованное расширение для фотографий, которое я скачал из App Store, работает хорошо. Я думаю, что это не проблема настройки iPhone - person TKang; 27.12.2016
comment
У меня та же проблема. Некоторые приложения из магазина тоже испытывают это, некоторые нет. Образец кода Apple также страдает от этого. Кажется, это происходит на конкретных фотографиях. - person Nicolas Miari; 15.09.2018
comment
@TKang Я скачал несколько расширений, а также собственный пример кода Apple. Удивительно, но код Apple и некоторые сторонние расширения (но не все) в Магазине также испытывают проблему с некоторыми фотографиями. Особенно надежным, который, кажется, всегда может успешно сохраняться, является BitCam. - person Nicolas Miari; 16.09.2018