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

Как получить домашний каталог пользователей в objective-c в изолированном приложении?

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

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

4b9b3361

Ответ 1

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

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()

Ответ 2

Из apple documentation:

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

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

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

Если вы используете команду POSIX, такую ​​как getpwuid, чтобы получить путь для фактического домашнего каталога пользователей, вместо этого используйте Cocoa или Основной символ Foundation, такой как функция NSHomeDirectory.. Используя Cocoa или Core Foundation, вы поддерживаете ограничение приложений Sandbox против прямого доступа к домашнему каталогу пользователей.

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

Ответ 3

С помощью 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/