Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.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
Swift 无法将AppleeEvent发送到系统进程_Swift_Xcode_Macos - Fatal编程技术网

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>