ver seguridad notes las guardan donde copias copia como borrar best archivos app ios objective-c temporary-directory

seguridad - ubicación temporal de la carpeta iOS



icloud (4)

Esta pregunta se convirtió en una sesión de preguntas y respuestas, porque encontré la respuesta mientras la preparaba. No importa, creo que vale la pena precisar esto:

Apple acaba de rechazar mi aplicación 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 eso además de los Documentos y la Biblioteca en la carpeta de la Aplicación.

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

Entonces: ¿ NSTemporaryDirectory() tiene un comportamiento diferente al usar el iPhone Simulator y es posible rastrear el directorio temporal de la aplicación en el momento de la depuración?


De acuerdo con los documentos , debe evitar NSTemporaryDirectory() en 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 una nueva carpeta temporal única cada vez que la llama y depende de usted limpiarla.


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

Entonces, en general, usar NSTemporaryDirectory() es la forma correcta de encontrar la ruta al directorio temporal, y que si quiere depurar y ver lo que se hace dentro, debe encontrarla manualmente en el Finder si está usando el Simulador de iPhone. .

Verifique la respuesta más reciente a continuación (esta está en desuso)


ACTUALIZACIÓN 2016 RESPUESTA:

  • Los datos aceptados explícitamente por el usuario como personales, y potencialmente respaldados en su espacio de iCloud, deben escribirse en el directorio "Documentos" del usuario

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

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

Consulte las explicaciones en esta página oficial de Apple para el desarrollo de iOS en la sección " Determinación de dónde almacenar sus archivos específicos de la aplicación ".

A continuación hay 3 funciones en Swift diseñadas para devolver los NSURL a estos directorios y hacer que su me gusta sea más simple.

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


iOS 9 o posterior • Swift 3 o posterior

let tmpDirURL = URL(fileURLWithPath: NSTemporaryDirectory())

iOS 10.0 + Beta, macOS 10.12+, tvOS 10.0 + Beta y watchOS 3.0+ • Xcode 8 • Swift 3 o posterior

let tmpDirURL = FileManager.default.temporaryDirectory