从沙盒可可应用程序发送键盘到最前面的应用程序

Ami*_*Sri 13 cocoa sandbox simulate keystrokes

我需要从我的cooca应用程序向最前面的应用程序发送击键.

我已经有了使用CGEventCreateKeyboardEvent()and的工作代码AXUIElementPostKeyboardEvent(),但它只适用于app不是沙盒的情况.

我已经搜索谷歌相同,但没有找到任何有效的解决方案.

我看到一个Text应用程序和其他几个人在沙盒环境中做同样的事情,所以我想知道,如果有人帮我弄清楚,aText.app和其他人如何能够在沙箱环境中发送击键.

谢谢,

eri*_*icg 5

这实际上是可能的。我在这里提供了一个示例应用程序 - GitHub 上的 SendKey

\n\n

我选择了简单的方法,从一个简单的 AppleScript 开始:

\n\n
delay 5\n\ntell application "System Events"\n    repeat 10 times\n        keystroke "#"\n    end repeat\nend tell\n
Run Code Online (Sandbox Code Playgroud)\n\n

脚本中的“延迟”只是给了我足够的时间让文本编辑器成为最前面的应用程序。我建议首先运行这个脚本来看看它的作用。

\n\n

然后,我使用默认的应用程序模板创建了一个 Xcode 项目并写道:

\n\n
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification\n{\n    NSString*       scriptPath  = [[NSBundle mainBundle] pathForResource:@"sendkey" ofType:@"scpt"];\n    NSURL*          scriptURL   = [NSURL fileURLWithPath:scriptPath];\n    NSDictionary*   errors;\n    NSAppleScript*  script      = [[NSAppleScript alloc] initWithContentsOfURL:scriptURL error:&errors];\n\n    NSLog( @"%@", errors );\n\n    [script executeAndReturnError:&errors];\n\n    NSLog( @"%@", errors );\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我在没有打开沙箱的情况下对此进行了测试,以验证它是否有效,并且确实如此。然后我打开沙盒,当然,它坏了。但幸运的是,有一种方法可以解决这个问题。目前,Apple 提供了名为com.apple.security.temporary-exception.apple-events 的临时权利。并且,您可以请求授予“com.apple.systemevents”例外。这是我的权利文件的样子:

\n\n
<?xml version="1.0" encoding="utf-8"?>\n<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"\n   "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n<plist version="1.0">\n  <dict>\n    <key>com.apple.security.temporary-exception.apple-events</key>\n    <array>\n      <string>com.apple.systemevents</string>\n    </array>\n    <key>com.apple.security.app-sandbox</key>\n    <true />\n  </dict>\n</plist>\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我将此权利添加到我的沙盒应用程序并对其进行签名后,它再次按预期工作。

\n\n

现在,如果您想发送其他密钥,此问题和解答将演示如何动态构建脚本 -将变量传递给 applescript

\n\n

当然,一旦您完成所有这些工作,您可能可以转向 NSAppleEventDescriptor 和相关类来在代码中构建事件,但我还没有使用该技术。

\n\n

请注意,Apple 建议您在使用临时权利时执行以下操作:

\n\n
\n

如果您选择现在不沙箱您的应用程序或使用临时\n 例外权利,请使用 Apple\xe2\x80\x99s 错误报告系统让 Apple\n 了解您遇到的问题。Apple 在开发 OS X 平台时会考虑功能请求。另外,请务必使用 iTunes Connect 中的\n 查看注释字段来解释\n 为何需要例外。

\n
\n

  • 有人真的使用这种技术获得了 App Store 批准的应用程序吗?我已经尝试过,但我的应用程序被拒绝,因为不允许它通过 AppleEvents 与“系统事件”对话。 (2认同)