Ошибка PHPhotoLibrary: редактирование контента в PerformChanges приводит к ошибке. Операция не может быть завершена. (Ошибка какао -1.)

Это код, который я запускаю в viewDidAppear совершенно нового быстрого приложения. info.plist правильно настроен с помощью клавиши Privacy - Photo Library Usage Description.

Я получаю ошибку The operation couldn’t be completed. (Cocoa error -1.)

Я могу создавать новые активы, удалять активы, избранные активы и возвращать активы... но попытка изменить их содержимое приводит к этой ошибке. Я пытался найти в Интернете любую подсказку о том, как решить эту проблему (переполнение стека, видео WWDC, вторая страница Google, bing и даже yahoo).

PHPhotoLibrary.requestAuthorization { (status:PHAuthorizationStatus) in

    if status != PHAuthorizationStatus.authorized { return }

    let results = PHAsset.fetchAssets(with: nil)
    guard let asset = results.firstObject else { return }

    if asset.canPerform(.content) {

        let inputOptions = PHContentEditingInputRequestOptions()
        inputOptions.isNetworkAccessAllowed = true
        inputOptions.canHandleAdjustmentData = { (asjustmentData) -> Bool in
            return false
        }

        asset.requestContentEditingInput(with: inputOptions, completionHandler: { (input, info) in
            guard let input = input else { return }

            guard let inputImageURL = input.fullSizeImageURL,
            let inputImage = CIImage(contentsOf: inputImageURL) else { return }

                guard let eagle = EAGLContext(api: .openGLES2) else { return }
            let context = CIContext(eaglContext: eagle)
            guard let outputImageRef = context.createCGImage(inputImage, from: inputImage.extent) else { return }
            let outputImage = UIImage(cgImage: outputImageRef, scale: 1.0, orientation: .right)

            let output = PHContentEditingOutput(contentEditingInput: input)

            guard let imageData = UIImageJPEGRepresentation(outputImage, 0.9) else { return }
                try! imageData.write(to: output.renderedContentURL, options: .atomic)

            output.adjustmentData = PHAdjustmentData(formatIdentifier: "myFormat", formatVersion: "1.0", data: Data())

            DispatchQueue.main.async {
                PHPhotoLibrary.shared().performChanges({

                    let request = PHAssetChangeRequest(for: asset)
                    request.contentEditingOutput = output

                }, completionHandler: { (success, error) in
                    print(success ? "It worked" : "It failed with error:")
                    print(error?.localizedDescription ?? "No Errors!")
                })
            }
        })
    }
}

ПРИМЕЧАНИЕ при возврате появляется диалоговое окно iOS «Вы хотите изменить», однако с приведенным выше кодом диалоговое окно не появляется, и приложение не аварийно завершает работу.


person zrubenst    schedule 18.08.2017    source источник
comment
Всем привет. Я тоже не могу найти обходной путь для этой неприятной ошибки. Мне было интересно, если вам повезло преодолеть эту проблему. Не могли бы вы поделиться?   -  person user1244109    schedule 12.01.2018
comment
@ user1244109 не повезло. Пошел с обходным путем (сохранение новых изображений), не таким приятным, как редактирование изображения.   -  person zrubenst    schedule 12.01.2018


Ответы (2)


Пожалуйста, попробуйте это.

let inputImage = CIImage(contentsOf: inputImageURL) else { return }

// additional code
inputImage = inputImage.applyingOrientation(input.fullSizeImageOrientation)

и измените «вправо» на «вверх».

// before
let outputImage = UIImage(cgImage: outputImageRef, scale: 1.0, orientation: .right)

// after
let outputImage = UIImage(cgImage: outputImageRef, scale: 1.0, orientation: .up)
person Osamu    schedule 30.09.2017

Я столкнулся с этой же ошибкой. Исправление, которое сработало для меня, заключалось в том, чтобы убедиться, что Data, переданный PHAdjustmentData, действительно имеет какое-то содержимое. Другими словами, если он пуст, операция завершается неудачно.

В моем случае мне не нужно хранить какие-либо реальные данные, поэтому я пошел с этим:

// ...
let output = PHContentEditingOutput(contentEditingInput: input)
output.adjustmentData = PHAdjustmentData(
  formatIdentifier: "customImport",
  formatVersion: "1",
  data: "????".data(using: .utf8)!
)
// ...
person Matias Korhonen    schedule 31.07.2021