Как я могу получить изображение профиля авторизованного пользователя? - PullRequest
0 голосов
/ 13 апреля 2020

macOS позволяет пользователям устанавливать изображение профиля для своих локальных учетных записей. Это изображение можно изменить на панели настроек системы «Учетные записи», и оно отображается при входе в систему. Есть ли способ получить к нему доступ, используя Какао или какой-либо другой системный фреймворк?

1 Ответ

0 голосов
/ 13 апреля 2020

Информация доступна из открытого каталога, как предлагает dscl . -read /Users/my_user_name_here, имеющий атрибуты JPEGPhoto и Picture. Платформа Open Directory довольно древняя: документация скудна, а примеры почти отсутствуют, но во время копания я обнаружил Python test в репозитории Apple, который показывает, как использовать API для начала работы. Я наконец придумал это:

NSData *getODImage(NSString *userName) {
    ODNode *local = [ODNode nodeWithSession:ODSession.defaultSession name:@"/Local/Default" error:nil];
    if (!local) {
        return nil;
    }
    ODRecord *record = [local recordWithRecordType:kODRecordTypeUsers name:userName attributes:nil error:nil];
    if (!record) {
        return nil;
    }
    NSArray *photoAttributes = @[kODAttributeTypePicture, kODAttributeTypeJPEGPhoto];
    NSDictionary *details = [record recordDetailsForAttributes:photoAttributes error:nil];
    if (!details) {
        return nil;
    }

    NSData *jpegData = [details[kODAttributeTypeJPEGPhoto] objectAtIndex:0];
    if (jpegData) {
        return jpegData;
    }

    for (NSString *picturePath in details[kODAttributeTypePicture]) {
        NSData *pictureContents = [NSData dataWithContentsOfFile:picturePath];
        if (pictureContents) {
            return pictureContents;
        }
    }
    return nil;
}

, где userName - результат NSUserName(). Кажется, это выполняется быстро локально, но у меня все еще есть запуск из параллельной очереди, чтобы избежать блокировки основного потока.

Путь к изображению, возвращаемый через kODAttributeTypePicture, находится в глобальном каталоге /Library, который доступен для чтения из песочницы по умолчанию. Это касается всех пользовательских изображений по умолчанию. Однако это может быть не всегда так, поэтому подготовьтесь к тому, что у вас не будет изображения.

Говоря о правильности, YMMV, когда пользователь является пользователем сети; Я думаю, что вам придется изменить узел с / Local / Default на что-то другое.

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