在macOS上检测用户注销

时间:2019-07-01 16:46:42

标签: objective-c macos

我目前正在尝试检测macOS 10.14(Mojave)中的用户注销。我发现了过去的这种方法:

Catching Logoff (not power off) event on MAC using objective C

我使用的代码是:

NSAppleEventManager* m = [NSAppleEventManager sharedAppleEventManager];
NSAppleEventDescriptor* desc = [m currentAppleEvent];

switch ([[desc attributeDescriptorForKeyword:kAEQuitReason] int32Value])
{
    case kAELogOut:
    case kAEReallyLogOut:
        // log out
        break;
    case kAEShowRestartDialog:
    case kAERestart:
        // system restart
        break;
    case kAEShowShutdownDialog:
    case kAEShutDown:
        // system shutdown
        break;
    default:
        // ordinary quit
        break;
}

但是我得到的值始终为零(0)。

莫哈韦沙漠(Mojave)发生了变化吗?还是还有其他机制?在我的applicationShouldTerminate的{​​{1}}函数中调用此代码。

1 个答案:

答案 0 :(得分:0)

它仍然可用并且可以工作(刚刚在macOS Big Sur上进行了测试),但是该值位于enumCodeValue属性中。

func applicationShouldTerminate(_ sender: NSApplication) -> NSApplication.TerminateReply {
    let reason = NSAppleEventManager.shared()
        .currentAppleEvent?
        .attributeDescriptor(forKeyword: kAEQuitReason)
    
    switch reason?.enumCodeValue {
    case kAELogOut, kAEReallyLogOut:
        print("Logout")
        return .terminateNow
        
    case kAERestart, kAEShowRestartDialog:
        print("Restart")
        return .terminateNow
        
    case kAEShutDown, kAEShowShutdownDialog:
        print("Shutdown")
        return .terminateNow
        
    case 0:
        // `enumCodeValue` docs:
        //
        //    The contents of the descriptor, as an enumeration type,
        //    or 0 if an error occurs.
        print("We don't know")
        return .terminateNow
        
    default:
        print("Cmd-Q, Quit menu item, ...")
        return .terminateNow
    }
}