Cuando pensamos en desarrollar aplicaciones para Mac, siempre nos viene a la mente Cocoa, y junto a este Framework aparece el lenguaje mas maquero, Objetive-C. Sin embargo, es posible hacer aplicaciones completas usando otros lenguajes, como puede ser Java, C o C++ y los que, desde mi punto de vista, son mas interesantes, estoy hablando de los lenguajes de Script de «moda» Ruby y Python.
Gracias a RubyCocoa y PyObjc, podemos invocar a métodos de clases desarrolladas en ObjetiveC, lo que quiere decir que vamos a ser capaces de utilizar las librerias de Cocoa, desde nuestro lenguaje de script favorito. Además, como ambos vienen instalados por defecto en nuestros OSX, no tendremos que instalar nada para empezar a desarrollar con ellos.
Aparte de la posibilidad de crear aplicaciones Cocoa únicamente usando estos lenguajes de script, se nos abre otra posibilidad bastante interesante. Gracias a la inclusión en OSX del Scripting Bridge y combinándolo con la posibilidad que comentabamos de usar Python o Ruby para usar librerías hechas en Objetive-C, podremos comunicarnos con las aplicaciones Cocoa usando estos lenguajes.
Antiguamente, si hablamos de lenguajes de script, esta posibilidad de comunicación entre aplicaciones estaba limitada al propio AppleScript.
Particularmente no tengo nada en contra de AppleScript, pero siempre me pareció un lenguaje un tanto complicado de aprender, sin embargo, Python o Ruby me parecen lenguajes bastante prácticos, por lo que el hecho de poder usarlos como medio de comunicación con otras aplicaciones Cocoa, me parece una idea tremenda 🙂
A partir de OSX 10.5 se introdujo en el sistema operativo lo que se conoce como Scripting Bridge. Este sistema permite comunicarse con los objetos en ejecución usando mensajes de Objetive-C. Anteriormente la única manera de comunicarse con las aplicaciones era usando comandos AppleScript, por eso, este era el único lenguaje con el que podíamos, por ejemplo, recuperar las canciones de nuestra lista de iTunes.
Como seguramente habreís podido deducir, gracias también al Scripting Bridge, podemos comunicarnos con dichas aplicaciones usando el omnipresente Objetive-C
La inclusión del Scripting bridge, de la misma manera, es cruicial para la parte «servidora», es decir, el iTunes o el Safari, ya que ha simplificado en gran medida la forma de añadir soporte de Script a una aplicación, pese a que esta tarea sigue siendo no trivial.
Como siempre, la mejor forma de aprender algo es viendo algún ejemplo. Así que vamos a utilizar a Python para listar todas las canciones que tenemos en nuestra librería de iTunes.
El código para realizar esto es bastante sencillo como podemos ver:
import ScriptingBridge iTunes = ScriptingBridge.SBApplication.applicationWithBundleIdentifier_("com.apple.iTunes") for source in iTunes.sources(): print source.name() for playlist in source.playlists(): print "\\---", playlist.name() for track in playlist.tracks(): print "\t\\---", track.name()
Si lo ejecutamos, veremos como se lanza «silenciosamente» iTunes, y momentos después se nos muestra la lista de canciones.
Es importante apreciar que con sólo 6 lineas, estamos salvando muchisimas dificultades que existían en el pasado, y sobre todo, estamos abriendo una posibilidad tremenda para crear nuevas aplicaciones.
Ahora bien, os podeis preguntar, ¿Cómo se que métodos tiene un objeto SBApplication determinado?, ya que por mucho que sea sencillo, si no tenemos documentación al respecto no podemos hacer nada.
Para averiguar que nos ofrece una aplicación existen varios métodos, el mas «visual» es usando la opción de «Abrir Diccionario» del «AppleScript Editor». Como vemos en la captura.
El otro método «menos amigable» es usar los comandos sdef y sdp, que se encargan de «extraer» la definiciónes de script que posee una aplicación; como podemos ver en la captura de la terminal.
Estos comandos nos sacaran un fichero .h que podemos utilizar para importarlo en nuestro proyecto de Objetive-C, y que desde el punto de vista de nuestros lenguajes de script, nos van a permitir saber que métodos nos expone la aplicación.