Как получить домашний каталог пользователей в изолированном приложении? - PullRequest
21 голосов
/ 04 марта 2012

NSHomeDirectory() перенастраивает мой корень песочницы, а не мой домашний каталог.[@"~" stringByExpandingTildeInPath] делает то же самое.

Это /Users/username/Library/Containers/appID/Data - это то, что возвращается.Как мне получить /Users/username/?

Ответы [ 3 ]

32 голосов
/ 04 марта 2012

Если вы хотите путь к реальному домашнему каталогу пользователя, вы можете использовать:

char *realHome = getpwuid(getuid())->pw_dir;

Полный пример:

#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
#include <assert.h>

NSString *RealHomeDirectory() {
    struct passwd *pw = getpwuid(getuid());
    assert(pw);
    return [NSString stringWithUTF8String:pw->pw_dir];
}

Это дает вам путь в дом пользователя, но не дает автоматически доступ к этой папке.Как отмечалось в комментариях, вы можете использовать этот путь для:

  • предоставления разумной папки по умолчанию для диалогов открытия / сохранения
  • определения того, находитесь ли вы в песочнице, путем сравнения результатадо NSHomeDirectory()
10 голосов
/ 04 марта 2012

Из Apple Документация :

Доступ к пользовательским данным

API поиска пути Mac OS X над уровнем POSIX,возвращать пути относительно контейнера, а не относительно домашнего каталога пользователя.Если ваше приложение до того, как вы поместите его в песочницу, получит доступ к местоположениям в фактическом домашнем каталоге пользователя (~) и вы используете API-интерфейсы Какао или Core Foundation, то после включения песочницы ваш код для поиска пути автоматически использует контейнер вашего приложения.

При первом запуске изолированного приложения Mac OS X автоматически переносит файл основных настроек вашего приложения.Если ваше приложение использует дополнительные файлы поддержки, выполните однократную миграцию этих файлов в контейнер, как описано в разделе «Перенос приложения в изолированную программную среду».

Если вы используете команду POSIX, напримеркак getpwuid для получения пути к фактическому домашнему каталогу пользователя, рассмотрите вместо этого использование символа Какао или Базового Фонда, такого как функция NSHomeDirectory. Используя Какао или Базовый Фонд, вы поддерживаете ограничение Песочницы приложения против прямого доступа к дому пользователяdirectory.

Если вашему приложению для работы требуется доступ к домашнему каталогу пользователя, сообщите Apple о ваших потребностях, используя систему отчетов об ошибках Apple .

2 голосов
/ 17 октября 2017

Используя Swift, вы можете получить доступ к пути к домашнему каталогу пользователей из изолированного приложения, например:

var userHomeDirectoryPath : String {
    let pw = getpwuid(getuid())
    let home = pw?.pointee.pw_dir
    let homePath = FileManager.default.string(withFileSystemRepresentation: home!, length: Int(strlen(home)))

    return homePath
}


Я создал это решение на основе фрагмента в этом сообщении в блоге: http://zpasternack.org/accessing-the-real-home-folder-from-a-sandboxed-app/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...