Respondendo a comandos AppleScript em um aplicativo RubyMotion OS X

AppleScript é uma ótima maneira de permitir que os usuários façam interface com seu aplicativo e automatizem ações, mas não há muito por aí sobre como configurá-lo em um aplicativo Objective C / Cocoa, muito menos um escrito em RubyMotion. Passei algumas horas tentando descobrir isso, então resolvi documentar como fazê-lo funcionar aqui.

Primeiro, crie um novo aplicativo RubyMotion: motion create sample --template=osx. Em seguida, entre e modifique o Rakefile. Abaixo Motion::Project::App.setup do |app|, adicione as seguintes linhas:

app.info_plist['NSAppleScriptEnabled'] = 'YES'
app
.info_plist['OSAScriptingDefinition'] = 'scripting.sdef'

Agora crie um arquivo chamado scripting.sdefsob o resources/diretório e cole o seguinte nele: (observe que esta é uma versão bastante reduzida de um arquivo a partir daqui .)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dictionary SYSTEM "file://localhost/System/Library/DTDs/sdef.dtd">
<dictionary >="http://www.w3.org/2003/XInclude">
<xi:include href="file:///System/Library/ScriptingDefinitions/CocoaStandard.sdef" xpointer="xpointer(/dictionary/suite)"/>
<suite name="Simple Scripting Verbs" code="SVrb" description="Terminology for the SimpleScriptingVerbs Sample.">
<command name="do simple command" code="SVrbSimp" description="run a simple command with no parameters">
<cocoa class="SimpleCommand"/>
<result type="integer" description="returns the number seven"/>
</command>
</suite>
</dictionary>

Depois de fazer isso, crie um arquivo app/chamado simple_command.rb. Jogue isso aí:

class SimpleCommand < NSScriptCommand
def performDefaultImplementation
puts
'Responding to simple command'
NSNumber.numberWithInt(7)
end
end

Uma vez que você tem isso, construir seu aplicativo com rake, e executar este na linha de comando: osascript -e 'tell application "sample" to do simple command'. Você deve obter a saída desejada de 7. Não importa se você tem o aplicativo em execução ou ainda não. O aplicativo será iniciado pelo sistema, se ainda não tiver sido.

Este é um exemplo simples, mas você pode permitir que seus usuários façam coisas extremamente poderosas, permitindo que seu aplicativo tenha um script. Para ver mais exemplos do que pode ser feito, comandos com argumentos, por exemplo, verifique o exemplo SimpleScriptingVerbs da Apple .