Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.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 applescript中使用“的错误1002”;“关键代码”;从macOS应用程序调用时_Swift_Macos_Permissions_Applescript_Keystroke - Fatal编程技术网

Swift applescript中使用“的错误1002”;“关键代码”;从macOS应用程序调用时

Swift applescript中使用“的错误1002”;“关键代码”;从macOS应用程序调用时,swift,macos,permissions,applescript,keystroke,Swift,Macos,Permissions,Applescript,Keystroke,我正在尝试从我的macOS应用程序(Mojave,Xcode 10.3)运行一个AppleScript。但是,当从应用程序运行AppleScript时,我遇到以下错误: /Users/my_username/Desktop/test_apple_script.scpt:执行错误:系统事件出错:不允许osascript发送击键。(1002) 根据其他帖子,我已经确保我的应用程序可以控制我的计算机(系统首选项>安全和隐私>隐私>可访问性),并且它还可以控制系统事件(系统首选项>安全和隐私>隐私>自动

我正在尝试从我的macOS应用程序(Mojave,Xcode 10.3)运行一个AppleScript。但是,当从应用程序运行AppleScript时,我遇到以下错误:

/Users/my_username/Desktop/test_apple_script.scpt:执行错误:系统事件出错:不允许osascript发送击键。(1002)

根据其他帖子,我已经确保我的应用程序可以控制我的计算机(系统首选项>安全和隐私>隐私>可访问性),并且它还可以控制系统事件(系统首选项>安全和隐私>隐私>自动化)

这是我的申请书:

tell application "System Events"
    key code 48 using {command down}
end tell
脚本在脚本编辑器中运行时可以工作(我只需要在系统首选项>安全和隐私>隐私>可访问性中为脚本编辑器提供访问权限)

这是我用来从我的应用程序运行Apple脚本的代码(通过
osascript
):

当我运行一个只显示通知的简单AppleScript时,这段代码非常有效:

tell application "System Events"
    display dialog "Test"
end tell
如何使AppleScript在macOS应用程序中运行,就像在脚本编辑器中运行一样

编辑:对于更多上下文,这里的命令选项卡案例只是一个示例。我试图找到一种通用的方法,通过单击我的应用程序中的按钮来模拟键盘快捷键(例如,用户单击“剪切”按钮,应用程序的行为就像用户刚刚按下command+x一样)。可能有比使用AppleScript更好的方法,但我知道使用AppleScript可以实现我想要的

编辑:如果我的原始问题不清楚,显示通知的简单AppleScript已经在我的应用程序中运行。当我试图运行一个模拟用户从键盘输入的AppleScript时,问题就出现了

编辑:这里的代码暂时适用于我,但不再适用。我根本没有更改代码。我只是再次运行我的应用程序

let PlayPauseScript = "tell application \"Spotify\"\n playpause\n end tell"\"test\"\n end tell"
if let scriptObject = NSAppleScript(source: PlayPauseScript) {
    scriptObject.executeAndReturnError(nil)
}
编辑: 这就是目前的问题所在。根据建议,我将其添加到了我的
info.plist
,现在Spotify AppleScript可以持续工作(通过NSAppleScript调用时):

上述代码导致此对话框中出现:
发生未知错误:1002

当我的应用程序运行时,它会提示我让它控制系统事件,我总是这样做。我的应用程序没有沙盒。我相信
NSAppleScript
oascript
曾经对我有效,但在我再次运行应用程序时停止了工作(尽管我没有对代码做任何更改,但我几乎是肯定的)


我不知道这是否能提供信息,但是关于可能发生的事情,我唯一的另一个线索是,我必须在
security&privacy>privacy>accessibility
中检查和取消选中脚本编辑器的权限,才能让它运行这些AppleScripts,因为它告诉我脚本编辑器不允许发送击键。

修复
osascript 1002权限问题。

进入安全和隐私->隐私选项卡->可访问性->添加osascript(/usr/bin/osascript)


<>或使用< NSAppleScript > <代码>

这是你要考虑的两件事,而不是你的问题的真正答案。如果您想了解更多详细信息,我会根据您的要求对其进行编辑。(另外,我将在objective-C中添加代码示例,因为我仍在学习swift)

首先,如果你打算在你的应用程序中编写大量脚本,那么切换到它可能是值得的。Scripting Bridge是一个cocoa接口,用于应用程序描述其他应用程序,因此(借用我在别处找到的一个示例),如果您想在iTunes中获取当前曲目的名称,您可以执行以下操作:

iTuneApplication *iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
currentTrack = iTunes.currentTrack.name;
// '8' is the key code for 'c'
comCDownEvent = CGEventCreateKeyboardEvent(nil, 8, true); 
CGEventSetFlags(comCDownEvent, kCGEventFlagMaskCommand);
comCUpEvent = CGEventCreateKeyboardEvent(nil, 8, false); 
CGEventSetFlags(comCUpEvent, kCGEventFlagMaskCommand);
CGEventPostToPSN(targetAppProcessSerialNumber, comCDownEvent);
CGEventPostToPSN(targetAppProcessSerialNumber, comCUpEvent);
如果你想要Spotify的特定代码,我必须安装该应用程序;让我知道

第二,如果你想击键,你应该研究一下。QES允许您创建、发送和捕获输入事件。所以如果你想发送一个⌘C、 您可能会这样做:

iTuneApplication *iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
currentTrack = iTunes.currentTrack.name;
// '8' is the key code for 'c'
comCDownEvent = CGEventCreateKeyboardEvent(nil, 8, true); 
CGEventSetFlags(comCDownEvent, kCGEventFlagMaskCommand);
comCUpEvent = CGEventCreateKeyboardEvent(nil, 8, false); 
CGEventSetFlags(comCUpEvent, kCGEventFlagMaskCommand);
CGEventPostToPSN(targetAppProcessSerialNumber, comCDownEvent);
CGEventPostToPSN(targetAppProcessSerialNumber, comCUpEvent);
您无法从沙盒应用程序运行此代码,但我认为无论您采取何种方式,您都会遇到此问题

这些方法的主要优点是它们避免了切换上下文:这都是从cocoa完成的,因此您不需要调用shell或创建AppleScript环境,并且避免了涉及的所有翻译问题

Security & Privacy -> Privacy tab -> Accessibility
添加/usr/bin/osascript

注意:您可能还需要添加您的终端(在我的情况下是iTerm)


如果应用程序是沙盒,则无法使用
Process
运行脚本。这一点很好。但是,我的应用程序没有沙盒。您是否在Info.plist中添加了
nsappleeventsagedescription
?顺便问一下,为什么不使用
NSAppleScript
运行脚本,而不是执行shell迂回。请提供更多上下文。为什么需要模拟命令选项卡?在我看来,与通过osascript运行AppleScript相比,通过swift实现这一点似乎有更简单、更有效的方法。(还有更好的运行applescripts的方法,比如NSAppleScript)。但在我了解上下文之前,我真的不知道。@vadian,我只是把这个放到Info.plist:
nsappleeventsuagedescription-NSApplication
。这是正确的添加方式吗?(我对这个还真的很陌生。)我正在考虑使用NSAppleScript。工作得非常好。非常感谢。如果其他人也有同样的问题,为了添加
osascript
,我在终端中导航到它的目录,并使用
open.
在finder中查看目录。然后,您可以将文件从finder窗口拖到当您单击@Parag Bafna.UPDATE提到的系统首选项位置中的
+
时弹出的窗口中:这在我第一次运行代码时起作用,但在那之后它就停止工作了(我实际上只是停止了应用程序并重新启动了它)。我现在得到了相同的错误,即使
osascript
Security & Privacy -> Privacy tab -> Accessibility