2016-03-30 22 views
0

Ich schreibe eine App, die Freigabeerweiterung hat, um ausgewählte Foto in meiner App lokalen Speicher von iPhone Fotogalerie zu speichern. NSData WriteToFile gibt YES zurück, aber ich konnte die gespeicherte Datei nicht in dem Verzeichnis finden, in dem ich beim Schreiben Pfad angegeben habe. Kurz gesagt, NSData WriteToFile kann ein Foto nicht im angegebenen Pfad speichern.NSData WriteToFile Fehler beim Speichern eines Fotos aus der Galerie durch Share Extension

Unten ist mein Code.

- (IBAction)acceptButtonTapped:(id)sender 
{ 
    __block UIImage *photo; 
    for (NSExtensionItem *item in self.extensionContext.inputItems) 
    { 
     for (NSItemProvider *itemProvider in item.attachments) 
     { 
      if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeImage]) 
      { 
       [itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeImage options:nil completionHandler:^(UIImage *image, NSError *error) { 
        if(image) 
        { 
         dispatch_async(dispatch_get_main_queue(), ^{ 
          photo = image; 

          NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 

          [formatter setDateFormat:@"yyyy_MM_dd_hh_mm_ss"]; 

          NSString *fileName; 

          fileName = [NSString stringWithFormat:@"%@.jpeg",[formatter stringFromDate:[NSDate date]]]; 

          dataPath = [dataPath stringByAppendingPathComponent:fileName]; 
          NSData * imageData = [NSData dataWithData:UIImageJPEGRepresentation(image, 1.0)]; 
          BOOL isdone = [imageData writeToFile:dataPath atomically:NO]; 
          NSLog(@"%u", isdone); 
         }); 
        } 
       }]; 
       break; 
      } 
     } 
    } 

    [self.extensionContext completeRequestReturningItems:@[] completionHandler:nil]; 
} 

Jede Hilfe wäre sehr spürbar.

Vielen Dank.

+0

Bitte überprüfen Sie 'dataPath', d. H. Enthält es den Pfad Ihres lokalen Speichers wie DocumentDirectory? –

+0

es ist in DocumentDirectory, ich habe einen Ordner in DocumentDirectory erstellt und in das ich das Foto speichern. Hat es ein Problem damit? –

+0

Protokollieren Sie den Pfad zur Debug-Konsole im Simulator, kopieren Sie dann alles außer dem Dateinamen in die Zwischenablage, wechseln Sie zum Finder, drücken Sie den Befehl shift G und fügen Sie den Pfad in das Dialogfeld "Gehe zu Ordner" ein. Schau was passiert. Protokollieren Sie auch den Pfad zum Dokumentenverzeichnis in 'applicationDidFinishLaunching' und stellen Sie sicher, dass Ihr Pfad auf eine Datei in diesem Verzeichnis zeigt. –

Antwort

1

Wenn Sie versuchen, über die Freigabeerweiterung auf das Dokumentverzeichnis zuzugreifen, können Sie NO nicht tun. Share Extension oder andere Widgets sind separate Anwendungen von ihrer enthaltenen App und verfügen daher über eine eigene Sandbox. Sie müssen also App-Gruppen verwenden, um Dateien freizugeben.

Anwendungsgruppen sind in erster Linie für Erweiterungen gedacht, insbesondere für Widgets.

NSFileManager hat eine Methode auf es containerURLForSecurityApplicationGroupIdentifier: wo Sie in der Kennung passieren können Sie erstellt, wenn auf App-Gruppen für Ihre Anwendungen

NSURL *containerURL = [[NSFileManager defaultManager] 
      containerURLForSecurityApplicationGroupIdentifier:@"group.com.company.app"]; 

Sie die Dateien in diesem Verzeichnis speichern können drehen, da Sie die zugreifen können freigegebene Anwendungsgruppen sowohl von der Erweiterung als auch von der Host-App.

+0

Ja, Sie haben Recht mit der Container-URL, aber wenn ich eine Datei in dieser URL speichere, schlägt sie jedes Mal fehl. Muss ich ein Verzeichnis erstellen und dann versuchen, es zu speichern? Es zeigt mir den Fehler, dass keine solche Datei oder Verzeichnis –

+0

Sie müssen die App-Gruppe in der Registerkarte Projektfunktionen erstellen, die für Widget und Host-App gemeinsam sein muss. Und ändern Sie den Namen der erstellten App-Gruppenkennung im obigen Code. Dann sollte es funktionieren. –

0

Sie ändern DataPath bei jedem Durchlauf durch die Schleife und fügen einen anderen Dateinamen hinzu. Das wird eine ständig wachsende Reihe von schlecht geformten Pfaden erzeugen, die alle Dateinamen enthalten.

Tun Sie das nicht. Erstellen Sie eine neue lokale Variable filePath und konstruieren

filePath = [docsPath stringByAppendingPathComponent: filename]; 

Ihren Weg und LOOK AT IT Melden Sie einen Dateinamen in filePath verwenden. Wenn sich Ihr Programm nicht wie erwartet verhält, vertrauen Sie keiner Ihrer Annahmen, weil einer oder mehrere davon falsch sind.