2015-11-02 21 views
6

In iOS 9+ ottengo zero su qualsiasi tentativo di leggere dal file. Il file in questo caso è un percorso del file immagine.
utilizzandoPermesso di lettura file iOS 9

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

o

NSData(contentsOfFile: stringpath) 

azioni:
ho rimosso il "file: //" dal percorso e ora ha un problema di autorizzazioni.

errore di dominio = Codice NSCocoaErrorDomain = 257 "Il file‘IMG_0048.JPG’non può essere aperto perché non hai il permesso di vederlo." UserInfo = {NSFilePath =/var/mobile/Media/DCIM/100APPLE/IMG_0048.JPG, NSUnderlyingError = 0x13f978f50 {errore di dominio = Codice NSPOSIXErrorDomain = 1 "Operazione non consentita"}}

Ho aggiunto il NSAllowArbitraryLoads e impostalo su true.
ho cercato di cercare il file stesso utilizzando "NSSearchPathDirectory", tuttavia i percorsi non corrispondono in alcun modo

+0

Come stai ottenendo questi percorsi? sembra che tu abbia accesso alle immagini della fotocamera/galleria –

+1

Errore nel percorso. Per prima cosa prendi il tuo percorso in formato stringa. Quindi trova l'URL utilizzando il percorso del file. Quindi trova il contenuto nell'URL specificato. –

+0

utilizzando https://github.com/mikaoj/BSImagePicker PHAsset ha un valore denominato "PHImageFileURLKey" che è il percorso dell'immagine –

risposta

1

è più probabile ottenere questo errore, perché iOS applicazioni hanno accesso solo ai file all'interno della sua sandbox . Vedi Apple documentation su file system per i dettagli.

4

Ho riscontrato questo errore perché stavo tentando di accedere a più file nello stesso blocco. La correzione che ha funzionato per me stava cambiando la struttura del codice in modo tale che ogni URL del file è stato ottenuto, quindi letto da, prima di tentare di ottenere l'url del file successivo.

+0

Ti capita di sapere perché questo sta accadendo? Inoltre, come ottenere ciascun URL? Proviene da un set di AVA? – Shade

+1

Ho avuto un problema simile. Ottengo un URL del file system tramite 'PHImageManager.defaultManager(). RequestAVAssetForVideo()'. Se provo a utilizzare quell'URL più di una volta da "NSFileManager", ricevo un errore la seconda volta.Nel mio caso, ho una soluzione: sto copiando il file e poi facendo altre cose con esso. Se accedo alla mia nuova copia (piuttosto che all'originale) per la seconda operazione 'NSFileManager', funziona. Deve essere una cosa di sicurezza. Strano... –

0

Nella vostra applicazione, non si dispone dell'autorizzazione per accedere al file di /var/mobile/Media/DCIM/100APPLE/IMG_0048.JPG, a causa di Sandboxing.

Quindi, qualunque cosa tu faccia, non è possibile inizializzare NSData o UIImage con il percorso del file. Ma è possibile accedere al file di /var/mobile/Media/DCIM/100APPLE/xxx.mov con AVURLAsset. Nella mia applicazione, ho estratto i dati piuttosto che l'URL dalla galleria con il kit Foto e ho inizializzato UIImage con i dati.

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

funziona per me! Se hai altre opinioni, per favore dimmelo.

0

Nel mio caso, le autorizzazioni del file erano troppo restrittive, quindi non ho potuto leggere il file.

Aggiungendo il permesso di lettura e scrittura al file prima di accedervi è stato risolto.

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) 
}