Расположение временной папки iOS
Этот вопрос превратился в вопросы и ответы, потому что я нашел ответ во время его подготовки. Неважно, я думаю, что стоит уточнить это:
Apple недавно отклонила мое приложение, поскольку оно хранило временные файлы или файлы кэша в каталоге документов. Правильно. Их сообщение об отказе говорит, что "Временные файлы, используемые вашим приложением, должны храниться только в /tmp directory
Msgstr "Я полагаю, что это помимо Документов и Библиотеки в папке Приложения.
Я сейчас пытаюсь отладить эту проблему в 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, и можно ли отслеживать временный каталог приложения во время отладки?
4 ответа
ОБНОВЛЕНО 2016 ОТВЕТ:
Данные, которые явно приняты пользователем как личные и могут быть скопированы в его / ее пространство iCloud, должны быть записаны в пользовательский каталог "Документы".
Данные, которые принадлежат вашему приложению и расширяют его (например, пользователь расширения может загрузить,...), но которые НЕ находятся в комплекте, должны быть записаны в подпапку каталога "Application Support/" с названием вашего appID. Это также может быть каталог "Cache".
Данные с коротким временем жизни могут храниться в каталоге tmp вашего приложения. В этом случае использование NSTevenDirectory() возможно для получения каталога "tmp". Проверьте эту ссылку для дополнительной помощи.
Обратитесь к официальной странице разработки Apple для iOS в разделе " Определение места хранения файлов для вашего приложения ", чтобы получить объяснения.
Ниже приведены 3 функции в Swift, предназначенные для возврата 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)
}
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
Я проверил это на реальном устройстве, и он вернул: "/private/var/mobile/Applications/C82383-EBD6-4F72-BC16-A865478D27/tmp/tempzip.zip"
В общем, используя NSTemporaryDirectory()
это правильный способ найти путь к временному каталогу, и если вы хотите отлаживать и просматривать, что делается внутри, вам нужно найти его вручную в Finder, если вы используете iPhone Simulator.
Проверьте новый ответ ниже (этот не рекомендуется)
Согласно документам, вам следует избегать 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;
}
Имейте в виду, что это создает новую уникальную временную папку каждый раз, когда вы вызываете ее, и вы должны ее очистить.