【问题标题】:iOS temporary folder locationiOS 临时文件夹位置
【发布时间】:2012-08-07 12:41:55
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ios objective-c swift macos temporary-directory


    【解决方案1】:

    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
    

    【讨论】:

    【解决方案2】:

    2016 年更新答案:

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

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

    • 生命周期较短的数据可以存储在应用程序的 tmp 目录中。在这种情况下,可以使用 NSTemporaryDirectory() 来获取 "tmp" 目录查看this link 以获得更多帮助。

    请查看“确定在何处存储您的应用程序特定文件”部分中的 official iOS developement Apple page 以获取说明。

    以下是 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)
    }
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 如果你在这个 url 上存储一个文件,它会在那里保留多久?
      【解决方案4】:

      根据the docs,你应该避免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;
      }
      

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-18
      • 1970-01-01
      • 1970-01-01
      • 2017-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多