macos – 守护进程知道用户何时登录MAC

macos – 守护进程知道用户何时登录MAC,第1张

概述我有一个守护进程(用Obj C编写)运行,我想在一些用户登录时执行一些 *** 作.守护进程是否可以知道特定用户何时登录或退出OSX?登录时是否会抛出任何通知?我想避免使用Log in Item或Launch Agent.而且我还想避免轮询定时器来检查登录用户. 使用SCDynamicStoreCopyConsoleUser获取控制台用户名. CFStringRef consoleUserName = 我有一个守护进程(用Obj C编写)运行,我想在一些用户登录时执行一些 *** 作.守护进程是否可以知道特定用户何时登录或退出OSX?登录时是否会抛出任何通知?我想避免使用Log in Item或Launch Agent.而且我还想避免轮询定时器来检查登录用户.解决方法 使用SCDynamicStorecopyConsoleUser获取控制台用户名.

CFStringRef  consoleUsername = nil;uID_t        uID;gID_t        gID;consoleUsername = SCDynamicStorecopyConsoleUser(NulL,&uID,&gID);

将consoleUsername存储在某个成员变量中.
现在创建一个会话,以使用SCDynamicStoreCreate与系统配置服务器维护的动态存储进行交互

SCDynamicStoreRef   store;     CFStringRef         key;     CFArrayRef          keys;     CFRunLoopSourceRef  rls;     store = SCDynamicStoreCreate(                                     NulL,CFSTR("com.apple.dts.ConsoleUser"),callBackFunction,NulL                                     );    // Set it up to notify us when the console user value changes.    key = SCDynamicStoreKeyCreateConsoleUser(NulL);    assert(key != NulL);    keys = CFArrayCreate(NulL,(const voID **) &key,1,&kcfTypeArrayCallBacks);    //assert(keys != NulL);    success = SCDynamicStoresetNotificationKeys(store,keys,NulL);    //assert(success);    // Add it to the runloop.    rls = SCDynamicStoreCreateRunLoopSource(NulL,store,0);   // assert(rls != NulL);    CFRunLoopAddSource(CFRunLoopGetCurrent(),rls,kcfRunLoopDefaultMode);    mConsoleUsername = copyCurrentConsoleUsername(store);    CFRunLoopRun();    CFRunLoopSourceInvalIDate(rls);    CFRelease(rls);    CFRelease(keys);    CFRelease(key);    CFRelease(store);

实现callBackFunction函数.当控制台用户值更改时,您将收到回调.

static voID callBackFunction(                               SCDynamicStoreRef    store,CFArrayRef          changedKeys,voID *              info                               ){    CFStringRef         currentConsoleUser;    Boolean             dIDChange;    // Get the current console user.    currentConsoleUser = copyCurrentConsoleUsername(store);    if (currentConsoleUser == NulL)    {        return;    }    dIDChange = ! CFEqual(storedvalue,currentConsoleUser);    if (![currentConsoleUser isEqualToString:@"loginwindow"])    {      // pass this value to some method    }}
总结

以上是内存溢出为你收集整理的macos – 守护进程知道用户何时登录MAC全部内容,希望文章能够帮你解决macos – 守护进程知道用户何时登录MAC所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1004231.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存