35

我的应用程序刚刚被 Apple 拒绝,因为它在文档目录中存储了临时文件或缓存文件。正确的。他们的拒绝消息指出:

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

我想除了应用程序文件夹中的文档库之外。

我现在正试图在 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 模拟器是否有不同的行为,是否可以在调试时跟踪应用程序的临时目录?

4

4 回答 4

44

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

let tmpDirURL = URL(fileURLWithPath: NSTemporaryDirectory())

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

let tmpDirURL = FileManager.default.temporaryDirectory
于 2016-09-04T15:28:43.893 回答
26

2016 年更新答案:

  • 用户明确接受的个人数据,并可能备份在他/她的 iCloud 空间中,应写入用户的“文档”目录

  • 属于和扩展您的应用程序的数据(例如,扩展用户可以下载,...),但不在捆绑包中,应写入“Application Support/”目录的子文件夹,标题为您的 appID。它也可以是“缓存”目录

  • 生命周期较短的数据可以存储在应用程序的 tmp 目录中。在这种情况下,使用 NSTemporaryDirectory() 可以获得“tmp”目录检查此链接以获得更多帮助。

查看“确定在哪里存储您的应用程序特定文件”部分中的官方 iOS 开发 Apple 页面以获取解释。

以下是 Swift 中的 3 个函数,旨在将 NSURLs 返回到这些目录并使您的喜欢更简单。

斯威夫特

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)
}
于 2016-05-10T23:55:07.423 回答
12

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

所以总的来说,使用NSTemporaryDirectory()是找到临时目录路径的正确方法,如果你想调试和查看里面做了什么,如果你使用的是 iPhone 模拟器,你需要在 Finder 中手动找到它。

检查下面的较新答案(此答案已弃用)

于 2012-08-10T08:16:42.367 回答
9

根据文档,您应该避免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;
}

请注意,这会在您每次调用它时创建一个的唯一临时文件夹,并由您来清理它。

于 2013-09-21T20:24:37.943 回答