Где можно сохранить файлы в песочнице Mac? - программирование
Подтвердить что ты не робот

Где можно сохранить файлы в песочнице Mac?

В моем приложении Mac есть песочница, и мне нужно сохранить файл. Где я могу сохранить этот файл? Кажется, я не вижу конкретного места, где это разрешено без использования открытой панели. Вот как я делаю это на iOS:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];

Что такое эквивалент для изолированного каталога на Mac?

4b9b3361

Ответ 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**". 

Но это похоже на работу.