Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 守护进程,以了解用户何时登录到MAC_Macos_Cocoa_Launch Daemon - Fatal编程技术网

Macos 守护进程,以了解用户何时登录到MAC

Macos 守护进程,以了解用户何时登录到MAC,macos,cocoa,launch-daemon,Macos,Cocoa,Launch Daemon,我有一个守护进程(用objc编写)正在运行,我想在一些用户登录时执行一些操作。守护进程是否可能知道特定用户何时登录或注销OSX?发生登录时是否会引发任何通知?我希望避免使用登录项或启动代理。我还希望避免在计时器上轮询以检查登录的用户。使用scdynamicstorecompyconsoleuser获取控制台用户名 CFStringRef consoleUserName = nil; uid_t uid; gid_t gid; consoleUserName = SC

我有一个守护进程(用objc编写)正在运行,我想在一些用户登录时执行一些操作。守护进程是否可能知道特定用户何时登录或注销OSX?发生登录时是否会引发任何通知?我希望避免使用登录项或启动代理。我还希望避免在计时器上轮询以检查登录的用户。

使用
scdynamicstorecompyconsoleuser
获取控制台用户名

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
    }
}

一个程序怎么可能既是一个守护进程又是一个Cocoa应用程序呢?我想它是用Obj C编写的。。编辑问题这是个好问题。你能确认你的守护程序在根会话()中吗?特洛伊木马:是的,它在根会话hi@ShantiK中,你能分享你的守护程序项目来获取用户名吗?登录用户不一定会改变。我希望收到通知,即使同一用户注销并重新登录,您也可以根据需要修改callBackFunction。当用户注销并登录时,您将收到回拨。当用户注销时,您将收到控制台用户更改为“loginWindow”的通知。对于登录,您将收到控制台用户更改为“loginwindow”为“Some user”的通知。哦,好的。。出于某种原因,它似乎对我不起作用。我会去看看的