Это действительно возможно. Я сделал пример приложения доступным здесь — SendKey на GitHub
Я пошел по легкому пути и начал с простого AppleScript:
delay 5
tell application "System Events"
repeat 10 times
keystroke "#"
end repeat
end tell
«Задержка» в сценарии просто дает мне достаточно времени, чтобы сделать текстовый редактор самым передовым приложением. Я бы предложил начать с простого запуска этого скрипта, чтобы посмотреть, что он делает.
Затем я создал проект Xcode, используя шаблон приложения по умолчанию, и написал:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSString* scriptPath = [[NSBundle mainBundle] pathForResource:@"sendkey" ofType:@"scpt"];
NSURL* scriptURL = [NSURL fileURLWithPath:scriptPath];
NSDictionary* errors;
NSAppleScript* script = [[NSAppleScript alloc] initWithContentsOfURL:scriptURL error:&errors];
NSLog( @"%@", errors );
[script executeAndReturnError:&errors];
NSLog( @"%@", errors );
}
Я проверил это, не включая песочницу, чтобы убедиться, что это работает, и это сработало. Потом я включил Песочницу и, конечно же, она сломалась. Но, к счастью, есть способ обойти это. На данный момент Apple предоставляет временное право под названием 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.temporary-exception.apple-events</key>
<array>
<string>com.apple.systemevents</string>
</array>
<key>com.apple.security.app-sandbox</key>
<true />
</dict>
</plist>
Как только я добавил это право в свое изолированное приложение и подписал его, оно снова заработало, как и ожидалось.
Теперь, если вы хотите отправить другие ключи, этот вопрос и ответ продемонстрируют, как создать скрипт на лету — Передача переменных в сценарий Apple.
Конечно, когда все это заработает, вы, вероятно, сможете обратиться к NSApleEventDescriptor и связанным с ним классам для создания события в коде, но я не пробовал эту технику.
Обратите внимание, что Apple предлагает вам сделать следующее при использовании временного права:
Если вы решите не помещать свое приложение в песочницу сейчас или использовать временное право на исключение, используйте систему сообщений об ошибках Apple, чтобы сообщить Apple о проблеме, с которой вы столкнулись. Apple рассматривает запросы функций при разработке платформы OS X. Кроме того, обязательно используйте поле Review Notes в iTunes Connect, чтобы объяснить, почему необходимо исключение.
person
ericg
schedule
22.04.2013