当前位置: 首页 > 知识库问答 >
问题:

从macOS应用程序调用时使用“密钥代码”的applescript中出现错误1002

濮阳俊明
2023-03-14

我正试图从我的macOS应用程序(Mojave,Xcode 10.3)运行一个AppleScript。但是,当从应用程序运行AppleScript时,我会出现以下错误:

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

基于其他帖子,我已经确保我的应用程序可以控制我的电脑(系统偏好设置

这是我的申请书:

tell application "System Events"
    key code 48 using {command down}
end tell

脚本在脚本编辑器中运行时可以工作(我只需要在系统首选项中为脚本编辑器提供访问权限)

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

let proc = Process()
proc.launchPath = "/usr/bin/env"
proc.arguments = ["/usr/bin/osascript","/Users/my_username/Desktop/test_apple_script.scpt"]
proc.launch()

当我运行一个简单的AppleScript,只显示一个通知时,这个代码可以完美地工作:

tell application "System Events"
    display dialog "Test"
end tell

我如何使AppleScript从macOS应用程序运行,就像在脚本编辑器中运行一样?

编辑:关于更多的上下文,这里的命令选项卡只是一个例子。我试图找到一种通用的方法来模拟键盘快捷键,方法是在我的应用程序中单击按钮(例如,用户单击“剪切”按钮,应用程序就好像用户刚刚按下了命令x一样)。可能有比使用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)
}

编辑:这就是目前的问题所在。根据建议,我把这个添加到了我的信息中。plist,现在Spotify AppleScript可以持续工作(通过NSAppleScript调用时):

<key>NSAppleEventsUsageDescription</key> 
<string>...this is why I need permission...</string>

我(现在)的问题似乎只是使用系统事件的applescript。尽管确保我的应用程序和osascript都可以控制我的电脑(通过安全)

let script =
"""
try
    tell application "System Events"
        keystroke "c" using {command down}
    end tell
on error errMsg number errorNumber
    display dialog "An unknown error occurred:  " & errorNumber as text
end try
"""

if let scriptObject = NSAppleScript(source: script) {
    scriptObject.executeAndReturnError(nil)
}

上述代码导致该对话框出现:出现未知错误:1002

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

我不知道这是否能提供信息,但我唯一知道会发生什么的线索是,我一直不得不在安全中检查和取消检查脚本编辑器的权限


共有3个答案

暴辰龙
2023-03-14

这是你要考虑的两件事,不仅仅是你的问题的真正答案。如果你想了解更多细节,我很乐意按要求编辑。(此外,我将在objective-C中列出代码示例,因为我仍在学习swift)

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

iTuneApplication *iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
currentTrack = iTunes.currentTrack.name;

如果你想要Spotify的特定代码,我必须安装该应用;让我知道。

第二,如果你想按键,你应该研究石英事件服务。QES允许您创建、发送和捕获输入事件。所以如果你想发送⌘C、 你可以这样做:

// '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环境,也避免了所有涉及的翻译问题。

郑博厚
2023-03-14
Security & Privacy -> Privacy tab -> Accessibility

添加 /usr/bin/osascript

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

巫墨一
2023-03-14

修复osascript 1002权限问题。

到了保安处

或者使用NSAppleScript

 类似资料:
  • 我有一个现有的密钥库,里面有一个密码,还有几个不同密码的密钥,供我导出并上传到Google Play的不同应用程序使用。 现在,我最近导入了一个应用程序的项目,对它做了一些重大的修改,我正在尝试使用相同的密钥库和选择相同的别名/密码来导出它,就像我最初创建它时一样。 问题是,在我选择密钥别名并输入密钥密码的步骤之后,我看到“错误:无法恢复密钥”。 我怀疑我可能输入了一个错误的密钥密码(注意密钥库密

  • 在运行net472 web应用程序的Azure应用程序服务中,我从密钥库访问证书,如下所示: 这一行抛出一个错误

  • 当我连续发布数据时,我会在C#应用程序上得到发布超时错误,一旦我重新启动应用程序,它会工作几个小时。[注意:由于php需要时间完成任务,所以新的请求都在等待中,它创建队列,等待时间超过2分钟,im出现超时错误]。 我们的两台服务器都使用了最大50%的CPU和RAM使用量 我检查了两个C#代码和PHP代码都工作良好,没有任何问题或bug 提前致谢哥们儿:)

  • [Get-AzureKeyVaultSecret],PSInvalidOperationException FullyQualifiedErrorId:InvalidOperation,Microsoft.azure.commands.keyVault.GetAzureKeyVaultSecret 2018-04-14T17:45:00.709[Error]执行函数时出现异常:functions.

  • 几天以来,我在运行Struts网络应用程序时遇到了一些问题。我尝试了StackOverflow中与我的问题相关的几个解决方案,但都不起作用。 网状物xml: struts。xml: 登录。jsp: 登录。爪哇: 我补充说: commons-logging-1.1.3。罐子 freemarker-2.3.19。罐子 ognl-3.0.6。罐子 struts2-core-2.3.15.1。罐子 xwo

  • null 脚本'C:\src\flutter\packages\flutter_tools\gradle\flutter.gradle'行:838 出了什么问题: 任务“:app:CompileFlutterBuildreLease”执行失败。 null null 应用程序:Build.Gradle