Incapaz de editar capturas de pantalla, el bloque performChanges falla

Estoy desarrollando una aplicación que permite a los usuarios editar fotos usando PhotoKit. Antes guardaba la foto editada en el disco como un JPEG. Me gustaría evitar convertir a JPEG y haber implementado las modificaciones para poder hacerlo. Funciona muy bien para las fotos tomadas con la camera, pero si intenta editar una captura de pantalla, el PHPhotoLibrary.shanetworkingPhotoLibrary().performChanges fallará y registrará. The operation couldn't be completed. (Cocoa error -1.) The operation couldn't be completed. (Cocoa error -1.) . No estoy seguro de por qué esto está causando que el bloque performChanges falle, ¿qué he hecho mal aquí?

He creado una aplicación de ejemplo disponible para download que demuestra el problema, y ​​he incluido el código relevante a continuación. La aplicación intenta editar la foto más reciente en su biblioteca de fotos. Si sucede, solicitará acceso para editar la foto, de lo contrario no ocurrirá nada y verá el logging de la console. Para reproducir el problema, tome una captura de pantalla y luego ejecute la aplicación.

Código actual que funciona con capturas de pantalla:

 let jpegData: NSData = outputPhoto.jpegRepresentationWithCompressionQuality(0.9) let contentEditingOutput = PHContentEditingOutput(contentEditingInput: self.input) var error: NSError? let success = jpegData.writeToURL(contentEditingOutput.rendenetworkingContentURL, options: NSDataWritingOptions.AtomicWrite, error: &error) if success { return contentEditingOutput } else { return nil } 

Código de reemploop que provoca fallos en las capturas de pantalla:

 let url = self.input.fullSizeImageURL let orientation = self.input.fullSizeImageOrientation var inputImage = CIImage(contentsOfURL: url) inputImage = inputImage.imageByApplyingOrientation(orientation) let outputPhoto = createOutputImageFromInputImage(inputImage)! let originalImageData = NSData(contentsOfURL: self.input.fullSizeImageURL)! let imageSource = CGImageSourceCreateWithData(originalImageData, nil) let dataRef = CFDataCreateMutable(nil, 0) let destination = CGImageDestinationCreateWithData(dataRef, CGImageSourceGetType(imageSource), 1, nil) //getType automatically selects JPG, PNG, etc based on original format struct ContextStruct { static var ciContext: CIContext? = nil } if ContextStruct.ciContext == nil { let eaglContext = EAGLContext(API: .OpenGLES2) ContextStruct.ciContext = CIContext(EAGLContext: eaglContext) } let cgImage = ContextStruct.ciContext!.createCGImage(outputPhoto, fromRect: outputPhoto.extent()) CGImageDestinationAddImage(destination, cgImage, nil) if CGImageDestinationFinalize(destination) { let contentEditingOutput = PHContentEditingOutput(contentEditingInput: self.input) var error: NSError? let imageData: NSData = dataRef let success = imageData.writeToURL(contentEditingOutput.rendenetworkingContentURL, options: .AtomicWrite, error: &error) if success { //it does succeed return contentEditingOutput } else { return nil } } 

El problema ocurre debido al hecho de que las fotos ajustadas siempre se guardan como files JPG, y las capturas de pantalla son en realidad files PNG.

Se me ocurrió mientras estaba depurando tu proyecto de ejemplo y vi en el PhotoEditor, contentEditingOutput.rendenetworkingContentURL es una URL a un JPG, mientras que si examinas el resultado de CGImageSourceGetType(imageSource) está claro que es un PNG (devuelve un PNG UTI: public.png).

Así que fui a leer la documentation de rendenetworkingContentURL que establece que si edita un recurso fotográfico, la image alterada está escrita en formatting JPEG, lo que claramente no funcionará si su image es un PNG. Esto me lleva a pensar que Apple no es compatible con la edición de files PNG o no quiere que lo haga. Imagínate..