Sha*_*i K 4 macos cocoa launch-daemon
我有一个守护进程(用Obj C编写)运行,我想在一些用户登录时执行一些操作.守护进程是否可以知道特定用户何时登录或退出OSX?登录时是否会抛出任何通知?我想避免使用Log in Item或Launch Agent.而且我还想避免轮询定时器来检查登录用户.
使用SCDynamicStoreCopyConsoleUser得到控制台的用户名.
CFStringRef consoleUserName = nil;
uid_t uid;
gid_t gid;
consoleUserName = SCDynamicStoreCopyConsoleUser(NULL, &uid, &gid);
Run Code Online (Sandbox Code Playgroud)
存储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);
Run Code Online (Sandbox Code Playgroud)
实现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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1096 次 |
| 最近记录: |