我有一个守护进程(用 Obj C 编写)正在运行,我想在某些用户登录时执行一些操作。守护进程是否可以知道特定用户何时在 OSX 中登录或注销?登录时是否有任何通知?我想避免使用登录项目或启动代理。而且我还想避免在计时器上轮询以检查登录用户。
问问题
1509 次
1 回答
7
用于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
}
}
于 2014-04-24T11:29:31.813 回答