Подтвердить что ты не робот

Временное расположение папки iOS

Этот вопрос обратился к Q & A, потому что я нашел ответ, пока готовя его. Nevermind, я думаю, это стоит того, чтобы это сделать:

Мое приложение было отклонено Apple, потому что оно хранило временные файлы или файлы кеша в каталоге документов. Правильно. В сообщении об их отказе говорится, что "временные файлы, используемые вашим приложением, должны храниться только в /tmp directory". Я полагаю, что помимо Документов и Библиотека в папке приложения.

Теперь я пытаюсь отладить эту проблему в iPhone Simulator, и когда я использую 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 Simulator и можно ли отслеживать временный каталог приложения во время отладки?

4b9b3361

Ответ 1

ОБНОВЛЕНО 2016 ОТВЕТ:

  • Данные, которые явно принимаются пользователем как личные и потенциально подкрепленные в его/ее пространстве iCloud, должны быть записаны в каталоге "Документы"

  • Данные, которые принадлежат и расширяют ваше приложение (внутренний пользователь может загрузить, например,...), но который НЕ находится в комплекте, должны быть записаны в подпапке "Поддержка приложений/каталог, имеющий название вашего приложения. Это также может быть каталог " Cache".

  • Данные с коротким временем жизни могут быть сохранены в каталоге tmp вашего приложения. В этом случае использование NSTemporaryDirectory() можно получить в каталоге tmp. Для дополнительной справки эту ссылку.

Отметьте эту официальную страницу Apple iOS для разработки Apple в разделе " Определение места хранения ваших файлов для приложения" для объяснения.

Ниже приведено 3 функции в Swift, предназначенные для возврата NSURL в эти каталоги и упрощения.

Swift

func GetDocumentsDirectory()->NSURL{
    //returns User "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 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 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)
}

Ответ 2

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

Ответ 3

Я тестировал это на реальном устройстве и возвращал его: "/private/var/mobile/Applications/C82383-EBD6-4F72-BC16-A865478D27/tmp/tempzip.zip"

В целом, используя NSTemporaryDirectory(), это правильный способ найти путь к временному каталогу, и если вы хотите отлаживать и посмотрите, что сделано внутри, вам нужно найти его вручную в Finder, если вы используете iPhone Simulator.

Проверьте новый ответ ниже (этот устаревший)

Ответ 4

В соответствии с документами вы должны избегать 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;
}

Имейте в виду, что это создает новую уникальную папку temp каждый раз, когда вы ее вызываете, и вам нужно очистить ее.