iosobjective-cswiftmacostemporary-directory

iOS temporary folder location


My app has just been rejected by Apple because it was storing temporary or cache files in the documents directory. Right. Their rejection message states:

Temporary files used by your app should only be stored in the /tmp directory

I suppose it is that besides the Documents and Library in the Application's folder.

I am now trying to debug this issue in the iPhone Simulator, and when I use NSTemporaryDirectory(), the value I get in the Xcode debugger is /var/folders/yj/gnz1c7156c7d6d4fj429yms40000gn/T/tempzip.zip, and not /Users/me/Library/Application Support/iPhone Simulator/5.1/Applications/8F71AB72-598C-427A-A116-36833D3209F7/tmp/tempzip.zip.

So: is NSTemporaryDirectory() having a different behaviour using the iPhone Simulator, and, is it possible to track the application's temporary directory at debug time ?


Solution

  • UPDATED 2016 ANSWER :

    Check this official iOS developement Apple page in section "Determining Where to Store Your App-Specific Files" for explanations.

    Below are 3 functions in Swift designed to return NSURLs to these directories and make your like simpler.

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