2012-08-10 23 views
14

Esta pregunta se convirtió en Q & A, porque encontré la respuesta mientras que lo estaba preparando. No importa, creo que vale la pena precisar esto:iOS carpeta temporal ubicación

Mi aplicación acaba de ser rechazada por Apple porque estaba almacenando archivos temporales o de caché en el directorio de documentos. Derecha. Su mensaje de rechazo dice que "los archivos temporales utilizados por su aplicación solo deben almacenarse en el /tmp directory". Supongo que es que además de Documentos y Biblioteca en la carpeta de la Aplicación.

Ahora estoy tratando de depurar este problema en el simulador de iPhone, y cuando uso NSTemporaryDirectory(), el valor de recibo en el depurador XCode es /var/folders/yj/gnz1c7156c7d6d4fj429yms40000gn/T/tempzip.zip, y no /Users/me/Library/Application Support/iPhone Simulator/5.1/Applications/8F71AB72-598C-427A-A116-36833D3209F7/tmp/tempzip.zip.

Entonces, ¿tiene NSTemporaryDirectory() comportamiento diferente utilizando el simulador de iPhone y es posible rastrear el directorio temporal de la aplicación en el momento de la depuración?

Respuesta

10

ACTUALIZADO 2016 RESPUESTA:

  • datos que se acepta explícitamente por el usuario tan personal, y potencialmente backuped en su/su espacio icloud, debe ser escrito en "Documentos" del usuario de directorio

  • Los datos que pertenecen y amplían su aplicación (un usuario de la extensión puede descargar, por ejemplo, ...), pero que NO están en el paquete, deben escribirse en una subcarpeta de "Application Support /" d irectory, que tiene el título de su ID de aplicación. También puede ser el directorio "Caché".

  • Los datos con un tiempo de vida corta se pueden almacenar en el directorio tmp de su aplicación. En este caso, el uso de NSTemporaryDirectory() es posible obtener el directorio "tmp". Verifique this link para obtener ayuda adicional.

Marque esta official iOS developement Apple page en la sección "Determinación del lugar para almacenar los archivos de aplicaciones específicas de" para explicaciones.

A continuación se muestran 3 funciones en Swift diseñadas para devolver NSURL a estos directorios y simplificar su configuración.

Swift:

func GetDocumentsDirectory()->NSURL{ 
    //returns User's "Documents" directory 
    //something like this on a real device : file:///private/var/mobile/Containers/Data/Application/APPID/Documents/ 
    //something like this on the simulator : file:///Users/MACUSERID/Library/Developer/CoreSimulator/Devices/SIMDEVICEID/data/Containers/Data/Application/APPUUID/Documents/ 
    let filemgr = NSFileManager.defaultManager() 
    let docsDirURL = try! filemgr.URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true) 
    return docsDirURL 
} 

func GetApplicationSupportDirectory()->NSURL{ 
    //returns Application's support directory 
    //something like this on a real device : file:///private/var/mobile/Containers/Data/Application/APPID/Library/Application%20Support/YOURAPPBUNDLEID/ 
    //something like this on the simulator : file:///Users/MACUSERID/Library/Developer/CoreSimulator/Devices/SIMDEVICEID/data/Containers/Data/Application/APPUUID/Library/Application%20Support/YOURAPPBUNDLEID/ 
    let AllDirectories : [NSURL] 
    var ApplicationSupportDirectory : NSURL=NSURL.init() 
    var ApplicationDirectory : NSURL=NSURL.init() 
    AllDirectories=NSFileManager.defaultManager().URLsForDirectory(.ApplicationSupportDirectory, inDomains: .UserDomainMask) 
    if AllDirectories.count>=1{ 
     ApplicationSupportDirectory=AllDirectories[0] 
    } 
    if !ApplicationSupportDirectory.isEqual(nil) { 
     ApplicationDirectory=ApplicationSupportDirectory.URLByAppendingPathComponent(NSBundle.mainBundle().bundleIdentifier!) 
    } 
    return ApplicationDirectory 
} 

func GetTemporaryDirectory()->NSURL{ 
    //returns Application's temporary directory 
    //something like this on a real device : file:///private/var/mobile/Containers/Data/Application/APPID/tmp/ 
    //something like this on the simulator : file:///Users/MACUSERID/Library/Developer/CoreSimulator/Devices/SIMDEVICEID/data/Containers/Data/Application/APPUUID/tmp/ 
    return NSURL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true) 
} 
11

he probado esto en un dispositivo real, y es devuelto: "/private/var/mobile/Applications/C82383-EBD6-4F72-BC16-A865478D27/tmp/tempzip.zip"

Así que en general, utilizar NSTemporaryDirectory() es la forma correcta de encontrar la ruta al directorio temporal, y si desea depurar y ver lo que se hace dentro, debe encontrarlo manualmente en el Finder si está utilizando el simulador de iPhone. a continuación

Comprobar nueva respuesta (éste es obsoleto)

+1

Si almacena un archivo en esta url, ¿cuánto tiempo permanecerá ahí? – user3916570

5

Según the docs, se debe evitar NSTemporaryDirectory() a favor de este enfoque

- (NSURL)URLForTemporaryFolder 
{ 
    // Get a parent folder, trying user folder (fails iOS) and falling back to AppSupport and Docs 
    NSURL *parentFolderURL = [NSURL URLForDirectory:NSUserDirectory domainMask:NSUserDomainMask]; 
    if (!parentFolderURL) parentFolderURL = [NSURL URLForDirectory:NSApplicationSupportDirectory domainMask:NSUserDomainMask]; 
    if (!parentFolderURL) parentFolderURL = [NSURL URLForDirectory:NSDocumentDirectory domainMask:NSUserDomainMask]; 

    // Get the temp folder URL using approach outlined in the docs 
    NSURL *tmpURL = [[NSFileManager defaultManager] 
    URLForDirectory:NSItemReplacementDirectory 
    inDomain:NSUserDomainMask 
    appropriateForURL:parentFolderURL 
    create:YES 
    error:NULL]; 

    return tmpURL; 
} 

Tenga en cuenta que esto crea un nueva carpeta temporal única cada vez que la llame y le toca a usted limpiarla.

+1

¿No es solo de OSX? – philippe

+0

Lo estoy usando en iOS y funciona bien. Sin embargo, tal vez hayan cambiado las cosas desde la publicación. –

+1

El enlace ahora está roto ... – Grimxn

12

IOS 10.0 + Beta, MacOS 10.12+, TVOS 10.0 + 3.0 + beta & watchos • Xcode 8

Swift 3

let tmpDirURL = FileManager.default.temporaryDirectory 

Swift 2.3

let tmpDirURL = NSFileManager.defaultManager().temporaryDirectory 
Cuestiones relacionadas