Информация доступна из открытого каталога, как предлагает 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 на что-то другое.