iOS临时文件夹位置

这个问题转到了Q&A,因为我在准备答案的时候find了答案。 没关系,我认为这是值得的:

我的应用程序刚刚被苹果拒绝,因为它在文档目录中存储临时文件或caching文件。 对。 他们的拒绝消息说“你的应用程序使用的临时文件只能存储在/tmp directory ”。 我想这是除了应用程序的文件夹中的文档

我现在试图在iPhone模拟器中debugging这个问题,当我使用NSTemporaryDirectory() ,我在XCodedebugging器中得到的值是/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 Simulator的不同行为,并且是否可以在debugging时跟踪应用程序的临时目录?

iOS 10.0 + Beta,macOS 10.12+,tvOS 10.0 + Beta和watchOS 3.0+•Xcode 8

Swift 3

 let tmpDirURL = FileManager.default.temporaryDirectory 

Swift 2.3

 let tmpDirURL = NSFileManager.defaultManager().temporaryDirectory 

我已经在真实的设备上testing过了,它返回:“/private/var/mobile/Applications/C82383-EBD6-4F72-BC16-A865478D27/tmp/tempzip.zip”

因此,总的来说,使用NSTemporaryDirectory()是find临时目录path的正确方法,如果要debugging和查看内部完成的操作,则需要在Finder中手动查找,如果使用的是iPhone Simulator 。

检查下面的更新的答案(这一个已被弃用)

2016年更新答案:

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

  • 属于并扩展您的应用程序的数据(一个扩展用户可以下载,例如…),但不在捆绑软件中的数据应写入“应用程序支持/”目录的子文件夹中,并具有appID的标题。 它也可以是“caching”目录

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

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

以下是Swift中的3个函数,用于将NSURL返回到这些目录,并使您更简单。

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

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

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