Swift applescript中使用“的错误1002”;“关键代码”;从macOS应用程序调用时
我正在尝试从我的macOS应用程序(Mojave,Xcode 10.3)运行一个AppleScript。但是,当从应用程序运行AppleScript时,我遇到以下错误: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) 根据其他帖子,我已经确保我的应用程序可以控制我的计算机(系统首选项>安全和隐私>隐私>可访问性),并且它还可以控制系统事件(系统首选项>安全和隐私>隐私>自动
/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