如何获得已登录用户的个人资料图片?

时间:2020-04-13 00:40:17

标签: objective-c macos cocoa

macOS允许用户为他们的本地帐户设置个人资料图片。可以在“帐户系统”首选项窗格中修改此图片,并在登录时特别显示。是否可以使用Cocoa或其他系统框架来访问它?

1 个答案:

答案 0 :(得分:0)

如具有dscl . -read /Users/my_user_name_hereJPEGPhoto属性的Picture所建议,可以从Open Directory访问该信息。 Open Directory框架相当古老:文档稀疏,示例几乎不存在,但在挖掘过程中,我在Apple存储库中发现了Python test,足以显示如何使用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;
}

其中userNameNSUserName()的结果。这似乎可以在本地快速执行,但是我仍然让它从并发队列运行以避免阻塞主线程。

通过kODAttributeTypePicture返回的图片路径位于全局/Library目录中,可从默认沙箱中读取该目录。所有默认用户图片都是这种情况。但是,可能并非总是如此,因此请准备好没有照片。

该用户为网络用户时说的是正确的YMMV;我认为您必须将节点从/ Local / Default更改为其他内容。