2016-01-29 10 views
6

Meine Foto-Erweiterung App hat Zugriff auf Kamera und Fotos. Alles ist in Ordnung, aber wenn Done gedrückt wird, kann es Bild nicht speichern.iOS-Foto-Erweiterung finishContentEditingWithCompletionHandler: Speichern nicht möglich

Code of Standard Abschluss-Handler:

- (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(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     PHContentEditingOutput *output = [[PHContentEditingOutput alloc] initWithContentEditingInput:self.input]; 

     NSError* error = nil; 

     NSData *renderedJPEGData = UIImageJPEGRepresentation(filtered_ui_image, 1.0); 
     assert(renderedJPEGData != nil); 
     //BOOL written_well = [renderedJPEGData writeToURL:output.renderedContentURL atomically:YES]; 

     BOOL written_well = [renderedJPEGData writeToURL:output.renderedContentURL options:NSDataWritingAtomic error:&error]; 
     assert(written_well); 



     // Call completion handler to commit edit to Photos. 
     completionHandler(output); 
    }); 
} 

renderedJPEGData ist nicht nil,
errornil ist, also Funktion [NSData writeToURL] erfolgreich war,
written_wellYES ist,

beim Debuggen Line-by- Zeile, nach Blockende erscheint eine Warnung: enter image description here

output.renderedContentURL ist /private/var/mobile/Containers/Data/PluginKitPlugin/509C1A04-D414-4DB7-B1E6-83C47FC88BC9/tmp/blah_blah_name.JPG

Also, ich Berechtigungen haben, Debug keine Fehler zeigt, was kann ich versuchen, die Ursache des Problems zu erkennen?

Antwort

0

Auch wenn der Header impliziert, dass adjustmentData Null sein kann, die Dokumentation heißt es:

Wenn Sie neue Asset-Inhalte an die URL der renderedContentURL Eigenschaft angegeben schreiben, müssen Sie auch eine neue, eindeutige PHAdjustmentData Objekt, das Ihre Bearbeitung beschreibt. Das Übergeben eines bereits vorhandenen Anpassungsdatenobjekts (das eine frühere Bearbeitung beschreibt) führt zu undefiniertem Verhalten.

So etwas tun, bevor der Abschluss-Handler Aufruf:

output.adjustmentData = [[PHAdjustmentData alloc] initWithFormatIdentifier:@"com.whatever.app" formatVersion:@"1.0" data:[NSData data]]; 
4

Ab iOS 10 müssen die Einstellungsdaten mindestens ein Byte. Dies ist eine bahnbrechende Änderung gegenüber iOS 9, bei der die Anpassungsdaten gleich Null sein können. Ich habe dies sowohl auf iOS 9 als auch auf iOS 10 getestet, um dies zu bestätigen.

Zusätzliche Dokumentation: https://developer.apple.com/reference/photos/phcontenteditingoutput/1518684-adjustmentdata

PHContentEditingOutput* output = [[PHContentEditingOutput alloc] initWithContentEditingInput:self.input]; 
NSMutableData* adjustmentData = [NSMutableData data]; 
uint8_t byte = 1; 
[adjustmentData appendBytes:&byte length:1]; 
output.adjustmentData = [[PHAdjustmentData alloc] initWithFormatIdentifier:@"com.yourcompany.yourapp" formatVersion:@"1.0f" data:adjustmentData];