Swift 无法将AppleeEvent发送到系统进程
我最近注意到,我的应用程序不再能够发送系统事件,如Swift 无法将AppleeEvent发送到系统进程,swift,xcode,macos,Swift,Xcode,Macos,我最近注意到,我的应用程序不再能够发送系统事件,如kAESleep、kAEReallyLogOut和kaeshutton,我一辈子都不知道为什么 我所能说的是,它在大约6个月前我上次测试这些特定选项时起了作用。从那时起,我可能已经升级了Xcode和操作系统本身,所以可能在幕后发生了一些变化 (非抛出)错误: 2018-04-22 10:24:36.548501+1000): 实现如下所示: do { try self.sendSystemCommand(command: kAEShutD
kAESleep
、kAEReallyLogOut
和kaeshutton
,我一辈子都不知道为什么
我所能说的是,它在大约6个月前我上次测试这些特定选项时起了作用。从那时起,我可能已经升级了Xcode和操作系统本身,所以可能在幕后发生了一些变化
(非抛出)错误:
2018-04-22 10:24:36.548501+1000):
实现如下所示:
do {
try self.sendSystemCommand(command: kAEShutDown)
print("Shutting down")
} catch {
print("Error sending `shut down` command to system")
}
有什么想法吗
编辑:经过多次反复,我相信这种行为是由应用程序沙箱系统造成的。我可以通过发送系统命令(如osascript-e'告诉应用程序“系统事件”关闭“
)来观察相同的问题。该命令在终端外壳中正常工作,但从我的应用程序发送时返回错误
我一直认为应用程序可以请求特权来发送系统事件命令,但我还没有弄清楚如何发送——它似乎没有很好的文档记录。我有这个问题要解决,我用Objective C实现了。就像这样
OSStatus SendAppleEventToSystemProcess(AEEventID EventToSend) {
AEAddressDesc targetDesc;
static const ProcessSerialNumber kPSNOfSystemProcess = { 0, kSystemProcess };
AppleEvent eventReply = { typeNull, NULL };
AppleEvent appleEventToSend = { typeNull, NULL };
OSStatus error = noErr;
error = AECreateDesc(typeProcessSerialNumber, &kPSNOfSystemProcess, sizeof(kPSNOfSystemProcess), &targetDesc);
if (error != noErr) {
return error;
}
error = AECreateAppleEvent(kCoreEventClass, EventToSend, &targetDesc, kAutoGenerateReturnID, kAnyTransactionID, &appleEventToSend);
AEDisposeDesc(&targetDesc);
if (error != noErr) {
return error;
}
error = AESend(&appleEventToSend, &eventReply, kAENoReply, kAENormalPriority, kAEDefaultTimeout, NULL, NULL);
//错误=AESendMessage(&AppleEventSend,&eventReply,kAENormalPriority,KaedFaultTimeout)
}尝试为com.apple.security.temporary exception.apple events
添加com.apple.systemevents
权限:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.application-groups</key>
<array>
<string>...</string>
</array>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.temporary-exception.apple-events</key>
<array>
<string>com.apple.systemevents</string>
</array>
</dict>
</plist>
com.apple.security.application-groups
...
com.apple.security.app-sandbox
com.apple.security.temporary-exception.apple-events
com.apple.systemevents
正如我在文章更新中提到的,我认为这是一个沙箱问题。虽然我在目标C方面帮不了你多少忙,但如果你遇到一个解决方案,请回帖是的,我可以在打开沙箱时关机,但在关闭沙箱时可以关机。
AEDisposeDesc(&appleEventToSend);
if (error != noErr) {
return error;
}
AEDisposeDesc(&eventReply);
return error;
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.application-groups</key>
<array>
<string>...</string>
</array>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.temporary-exception.apple-events</key>
<array>
<string>com.apple.systemevents</string>
</array>
</dict>
</plist>