iOS临时文件夹位置

phi*_*ppe 24 objective-c temporary-directory ios

我的应用程序刚被Apple拒绝,因为它将临时文件或缓存文件存储在文档目录中.对.他们的拒绝消息说明:

应用程序使用的临时文件只应存储在/tmp目录中

我想除了Application文件夹中的Documents and Library之外.

我现在正试图在iPhone模拟器中调试此问题,当我使用时NSTemporaryDirectory(),我在Xcode调试器中获得的值是/var/folders/yj/gnz1c7156c7d6d4fj429yms40000gn/T/tempzip.zip,而不是/Users/me/Library/Application Support/iPhone Simulator/5.1/Applications/8F71AB72-598C-427A-A116-36833D3209F7/tmp/tempzip.zip.

所以:NSTemporaryDirectory()使用iPhone模拟器有不同的行为,是否可以在调试时跟踪应用程序的临时目录?

Leo*_*bus 29

iOS 9或更高版本•Swift 3或更高版本

let tmpDirURL = URL(fileURLWithPath: NSTemporaryDirectory())
Run Code Online (Sandbox Code Playgroud)

iOS 10.0 + Beta,macOS 10.12 +,tvOS 10.0 + Beta和watchOS 3.0+•Xcode 8•Swift 3或更高版本

let tmpDirURL = FileManager.default.temporaryDirectory
Run Code Online (Sandbox Code Playgroud)

  • 功能方面,这是一样的。temporaryDirectory 是一个调用 NSTemporaryDirectory() 的 shim。https://github.com/apple/swift-corelibs-foundation/blob/eccf74b808e31b7205174941d4962f9c59835d4e/Foundation/FileManager.swift#L1420-L1422 (4认同)

phi*_*ppe 19

更新2016年回答:

  • 用户明确接受并且可能在他/她的iCloud空间中备份的数据应写在用户的"Documents"目录中

  • 属于并扩展您的应用程序的数据(扩展用户可以下载,例如,...),但不在捆绑包中,应该写在"Application Support /"目录的子文件夹中,具有appID的标题.它也可以是"Cache"目录.

  • 具有短寿命的数据可以存储在应用程序的tmp目录中.在这种情况下,可以使用NSTemporaryDirectory()来获取"tmp"目录.请查看此链接以获取更多帮助.

有关说明,请参阅 " 确定应用程序特定文件的存储位置 "部分中的iOS官方开发Apple页面.

下面是Swift中的3个函数,旨在将NSURL返回到这些目录并使您更简单.

斯威夫特:

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)
}
Run Code Online (Sandbox Code Playgroud)


phi*_*ppe 12

我在真实设备上对此进行了测试,然后返回:"/ private/var/mobile/Applications/C82383-EBD6-4F72-BC16-A865478D27/tmp/tempzip.zip"

总的来说,使用NSTemporaryDirectory()是查找临时目录路径的正确方法,如果要调试并查看其中的内容,则需要在Finder中手动查找,如果您使用的是iPhone模拟器.

查看下面的新答案(不推荐使用此答案)


Har*_*ngh 8

根据文档,你应该避免NSTemporaryDirectory()支持这种方法

- (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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,每次调用它时都会创建一个新的唯一临时文件夹,由您来清理它.

  • 小心,这个 API 有很多陷阱,在设备和模拟器上的行为不同!https://gist.github.com/steipete/d7a1506cdb1300cba0a3ae1b11450ab5 (2认同)