web-dev-qa-db-fra.com

Emplacement du dossier temporaire iOS

Mon application vient d'être rejetée par Apple car elle stockait des fichiers temporaires ou de cache dans le répertoire des documents. D'accord. Leur message de rejet indique:

Les fichiers temporaires utilisés par votre application ne doivent être stockés que dans le répertoire /tmp

Je suppose que c'est en plus de Documents et Library dans le dossier de l'application.

J'essaie maintenant de déboguer ce problème dans le simulateur iPhone, et lorsque j'utilise NSTemporaryDirectory(), la valeur que j'obtiens dans le débogueur Xcode est /var/folders/yj/gnz1c7156c7d6d4fj429yms40000gn/T/tempzip.Zip, Et non /Users/me/Library/Application Support/iPhone Simulator/5.1/Applications/8F71AB72-598C-427A-A116-36833D3209F7/tmp/tempzip.Zip.

Donc: NSTemporaryDirectory() a-t-il un comportement différent en utilisant le simulateur iPhone et est-il possible de suivre le répertoire temporaire de l'application au moment du débogage?

25
philippe

RÉPONSE 2016 MISE À JOUR:

  • Les données qui sont explicitement acceptées par l'utilisateur comme personnelles, et potentiellement sauvegardées dans son espace iCloud, doivent être écrites dans le répertoire "Documents" de l'utilisateur

  • Les données qui appartiennent et étendent votre application (un utilisateur d'extension peut télécharger par exemple, ...), mais qui ne fait PAS partie du bundle, doivent être écrites dans un sous-dossier de "Application Support /" , ayant le titre de votre appID. Il peut également s'agir du répertoire "Cache" .

  • Les données à durée de vie courte peuvent être stockées dans le répertoire tmp de votre application. Dans ce cas, l'utilisation de NSTemporaryDirectory () est possible pour obtenir le répertoire "tmp" . Vérifiez ce lien pour une aide supplémentaire.

Vérifiez ceci développement iOS officiel Apple dans la section " Déterminer où stocker vos fichiers spécifiques à l'application "pour des explications.

Vous trouverez ci-dessous 3 fonctions dans Swift conçues pour renvoyer les NSURL dans ces répertoires et vous simplifier la vie.

Rapide :

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

iOS 9 ou version ultérieure • Swift 3 ou version ultérieure

let tmpDirURL = URL(fileURLWithPath: NSTemporaryDirectory())

iOS 10.0 + Bêta, macOS 10.12+, tvOS 10.0 + Bêta et watchOS 3.0+ • Xcode 8 • Swift 3 ou version ultérieure

let tmpDirURL = FileManager.default.temporaryDirectory
33
Leo Dabus

J'ai testé cela sur un appareil réel et il a renvoyé: "/private/var/mobile/Applications/C82383-EBD6-4F72-BC16-A865478D27/tmp/tempzip.Zip"

Donc, dans l'ensemble, l'utilisation de NSTemporaryDirectory() est la bonne façon de trouver le chemin d'accès au répertoire temporaire, et que si vous souhaitez déboguer et voir ce qui est fait à l'intérieur, vous devez le trouver manuellement dans le Finder si vous utilisez le simulateur iPhone.

Vérifiez la réponse la plus récente ci-dessous (celle-ci est déconseillée)

12
philippe

Selon the docs , vous devriez éviter NSTemporaryDirectory() en faveur de cette approche

- (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;
}

Sachez que cela crée un nouveau dossier temporaire unique chaque fois que vous l'appelez et c'est à vous de le nettoyer.

8
Hari Karam Singh