2015-11-02 22 views
6

In iOS 9+ bekomme ich einen Nil bei jedem Versuch, aus der Datei zu lesen. Die Datei ist in diesem Fall ein Bilddateipfad.
iOS 9 lesen Dateierlaubnis

mit
NSData(contentsOfFile: stringpath, options: NSDataReadingOptions.DataReadingUncached) 

oder

NSData(contentsOfFile: stringpath) 

Aktionen:
ich das entfernt habe "file: //" aus dem Weg und es hat jetzt ein Problem mit den Berechtigungen.

Fehler Domain = NSCocoaErrorDomain-Code = 257 „Die Datei‚IMG_0048.JPG‘kann nicht geöffnet werden, weil Sie es nicht über die Berechtigung zu sehen.“ Userinfo = {NSFilePath =/var/mobile/Medien/DCIM/100APPLE/IMG_0048.JPG, NSUnderlyingError = 0x13f978f50 {Fehler Domain = NSPOSIXErrorDomain-Code = 1 "Operation not permitted"}}

Ich habe die NSAllowArbitraryLoads hinzugefügt und setze es auf wahr.
Ich habe für die Datei zu suchen versucht, mich in irgendeiner Weise nicht übereinstimmen „NSSearchPathDirectory“ aber die Wege mit

+0

Wie erhalten Sie diese Wege? scheint, als ob Sie Bilder von Kamera/Galerie zugreifen –

+1

Fehler im Pfad. Erhalte zuerst deinen Pfad im String-Format. Dann finden Sie die URL mithilfe des Dateipfads. Dann finde den Inhalt an der angegebenen URL. –

+0

mit https://github.com/mikaoj/BSImagePicker hat der PHAsset einen Wert namens "PHImageFileURLKey" welches ist der Pfad zum Bild –

Antwort

1

Sie sind am ehesten diesen Fehler, weil iOS nur Zugriff auf Dateien innerhalb seiner Sandbox Apps . Details finden Sie unter Apple documentation in Dateisystemen.

4

Dieser Fehler ist aufgetreten, weil ich versucht habe, auf mehrere Dateien im selben Block zuzugreifen. Der Fix, der für mich funktionierte, war das Ändern der Code-Struktur, so dass jede Datei-URL erhalten wurde, und dann von gelesen wurde, bevor versucht wurde, die nächste Datei-URL zu erhalten.

+0

Wissen Sie, warum das passiert? Wie erhält man die URL? Ist es von einem AVAsset? – Shade

+1

Ich hatte ein ähnliches Problem. Ich erhalte eine Dateisystem-URL über 'PHImageManager.defaultManager(). RequestAVAssetForVideo()'. Wenn ich versuche, diese URL mehrmals von 'NSFileManager' zu verwenden, erhalte ich beim zweiten Mal einen Fehler.In meinem Fall habe ich eine Problemumgehung: Ich kopiere die Datei und mache dann einige andere Dinge damit. Wenn ich auf meine neue Kopie (und nicht auf das Original) für die zweite 'NSFileManager'-Operation zugreife, funktioniert sie. Muss eine Sicherheitssache sein. Seltsam... –

0

In Ihrer Anwendung sind Sie aufgrund von Sandboxing nicht berechtigt, auf die Datei /var/mobile/Media/DCIM/100APPLE/IMG_0048.JPG zuzugreifen.

Also, was auch immer Sie tun, können Sie NSData oder UIImage mit dem Dateipfad nicht initialisieren. Aber Sie können auf die Datei /var/mobile/Media/DCIM/100APPLE/xxx.mov mit AVURLAsset zugreifen. In meiner Anwendung extrahierte ich die Daten statt der URL aus der Galerie von Photos Kit und initialisierte UIImage mit den Daten.

PHImageManager.default().requestImageData(
    for: assetObject!, options: options, 
    resultHandler: { 
     data, _, _, _ in 
     if data != nil { 
      self.assetUrl = movieMaker.createMovieFrom(imageData: data!, duration: Int(CXPreparetValue.imageDuration)) 
     } 
}) 

es funktioniert für mich! Wenn Sie andere Meinungen haben, bitte sagen Sie mir.

0

In meinem Fall waren die Dateiberechtigungen zu restriktiv, daher konnte ich die Datei nicht lesen.

Das Hinzufügen von Lese- und Schreibberechtigungen für die Datei vor dem Zugriff löste es.

do { 
    // Retrieve any existing attributes 
    var attrs = try FileManager.default.attributesOfItem(atPath: stringpath) 
    let existing = (attrs as NSDictionary).filePosixPermissions() 
    // Set the read+write value in the attributes dict 
    attrs[.posixPermissions] = existing | 0b110000000 
    // Update attributes 
    try FileManager.default.setAttributes(attrs, ofItemAtPath: stringpath) 

    // Read data from file 
    let data = try Data(contentsOf: URL(fileURLWithPath: stringpath, isDirectory: false), options: .uncached) 
    print("success: \(data.count)") 
} catch { 
    print(error) 
}