Где можно сохранить файлы в песочнице Mac?
В моем приложении Mac есть песочница, и мне нужно сохранить файл. Где я могу сохранить этот файл? Кажется, я не вижу конкретного места, где это разрешено без использования открытой панели. Вот как я делаю это на iOS:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
Что такое эквивалент для изолированного каталога на Mac?
Ответы
Ответ 1
Этот фрагмент кода работает на Mac независимо от того, изолировано ли ваше приложение.
В не-изолированном Mac приложении path
будет ссылаться на папку "Документы" в вашем доме: например. /Users/username/Documents
.
В песочнице приложение относится к папке в песочнице приложений: например. /Users/username/Library/Containers/com.yourcompany.YourApp/Documents
Подробнее см. документы.
Ответ 2
Руководство Apple Sandboxing очень полезно, найдено здесь.
У вас в основном есть папка, предназначенная для вашего приложения, как описано theAmateurProgrammer в ответ на мой вопрос здесь.
~/Library/контейнер/com.yourcompany.yourappname/
Вот что у меня есть, я улучшу его позже:
//Create App directory if not exists:
NSFileManager* fileManager = [[NSFileManager alloc] init];
NSString* bundleID = [[NSBundle mainBundle] bundleIdentifier];
NSArray* urlPaths = [fileManager URLsForDirectory:NSApplicationSupportDirectory
inDomains:NSUserDomainMask];
NSURL* appDirectory = [[urlPaths objectAtIndex:0] URLByAppendingPathComponent:bundleID isDirectory:YES];
//TODO: handle the error
if (![fileManager fileExistsAtPath:[appDirectory path]]) {
[fileManager createDirectoryAtURL:appDirectory withIntermediateDirectories:NO attributes:nil error:nil];
}
Ответ 3
Преобразование ответа @Mazyod в Swift (5.1):
var appPath: URL? {
//Create App directory if not exists:
let fileManager = FileManager()
let urlPaths = fileManager.urls(for: .applicationSupportDirectory, in: .userDomainMask)
if let bundleID = Bundle.main.bundleIdentifier, let appDirectory = urlPaths.first?.appendingPathComponent(bundleID,isDirectory: true) {
var objCTrue: ObjCBool = true
let path = appDirectory.path
if !fileManager.fileExists(atPath: path,isDirectory: &objCTrue) {
do {
try fileManager.createDirectory(atPath: path, withIntermediateDirectories: true, attributes: nil)
} catch {
return nil
}
return appDirectory
}
}
return nil
}
Однако каталог изменился, и я не уверен, что необходимо дополнительное повторение идентификатора пакета, поскольку путь
"/Users/**user name**/Library/Containers/**bundleID**/Data/Library/Application Support/**bundleID**".
Но это похоже на работу.