2012-08-10 75 views
14

這個問題轉向了Q & A,因爲我找到了答案,而 準備好了。沒想到,我認爲這是值得精簡的:iOS臨時文件夾位置

我的應用剛剛被蘋果拒絕,因爲它在文檔目錄中存儲臨時文件或緩存文件。對。他們的拒絕信息表示「您的應用使用的臨時文件只能存儲在/tmp directory」中。我想這是除了文檔在應用程序的文件夾。

我現在想在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模擬器,並且有可能在調試時跟蹤應用程序的臨時目錄嗎?

回答

10

已更新2016回答:這是由用戶明確爲個人所接受,並有可能在他/她的iCloud空間備份的

  • 數據,應該寫在用戶的「文檔」目錄

  • 數據屬於並擴展您的應用程序(擴展名用戶可以下載例如...),但不包含在該包中的數據應寫入子文件夾「Application Support /」d irectory,擁有您的appID的標題。它也可以是「緩存」目錄

  • 壽命短的數據可以存儲在應用程序的tmp目錄中。在這種情況下,使用NSTemporaryDirectory()可以獲得「tmp」目錄檢查this link獲取更多幫助。

入住這official iOS developement Apple page節「決定在何處存儲您的應用程序特定的文件」爲解釋。

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

我有一個真正的設備上進行了測試,它返回:「/private/var/mobile/Applications/C82383-EBD6-4F72-BC16-A865478D27/tmp/tempzip.zip」

所以,總體來說,使用NSTemporaryDirectory()是找到臨時目錄路徑的正確方法,並且如果要調試和查看內部完成的操作,則需要在Finder中手動查找,如果使用的是iPhone Simulator。下面

檢查更新的答案(這個人是不建議使用)

+1

如果您在此網址存儲文件,它會在那裏停留多久? – user3916570 2015-10-19 15:40:25

5

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

要知道,這將創建一個每次打電話時都有一個獨特的臨時文件夾,由您來清理。

+1

是不是隻是OSX? – philippe 2014-06-01 22:37:00

+0

我在iOS中使用它,工作正常。也許他們自從帖子後改變了事情。 – 2015-05-27 08:23:58

+1

鏈接現在被破壞... – Grimxn 2017-07-17 14:36:54

12

的iOS 10.0 +貝塔,MACOS 10.12+,tvOS 10.0 +貝塔& watchOS 3.0+•的Xcode 8

夫特3

let tmpDirURL = FileManager.default.temporaryDirectory 

Swift 2.3

let tmpDirURL = NSFileManager.defaultManager().temporaryDirectory