Aunque lenguajes de programación como Swift, Objective-C o Java nos permiten crear aplicaciones para Mac potentes y rápidas a veces hay funciones que AppleScript si puede hacer y otros lenguajes para Mac no pueden.
Un ejemplo de algo que AppleScript puede hacer con facilidad es consultar el estado y modificar el comportamiento de otra aplicación. Esto se debe a que muchas aplicaciones de MacOS incluyen librerías y diccionarios de soporte de AppleScript para que el propio sistema operativo pueda entablar comunicaciones con las aplicaciones.
Dentro de una aplicación podemos mezclar lenguajes de programación para conseguir los beneficios de todos ellos. Por ejemplo, crear un script en Swift que ejecute un script de AppleScript para manipular una aplicación.
Hacer hablar a VoiceOver desde Swift a través de AppleScript
Aunque con Swift tenemos acceso a las librerías de síntesis de voz del sistema no podemos directamente controlar a VoiceOver, el lector de pantallas para Mac, para que verbalice un mensaje con la configuración de habla definida por el usuario o mostrar el mensaje en una línea braille. Para realizar estas operaciones es necesario que a través de un script de AppleScript nos comuniquemos con VoiceOver.
El script de AppleScript que vamos a ejecutar
El script de AppleScript que necesitamos ejecutar es muy sencillo:
on sayWithVoiceOver(textToSay)
try
tell application "VoiceOver"
output textToSay
end tell
on error
say textToSay
end try
end sayWithVoiceOver
En esa función llamada sayWithVoiceOver llamamos a la aplicación VoiceOver para usar sus funciones de Output para mostrar el mensaje por la línea braille y usando la voz por defecto de VoiceOver.
El script en Swift
En Swift podemos utilizar la clase NSAppleScript para acceder al espacio de ejecución de AppleScript que nos proporciona MacOS.
Veamos un sencillo ejemplo usando el comando say de AppleScript.
import Foundation
let scriptCode = """
say "Hola mundo"
"""
var scriptOutput: NSAppleEventDescriptor?
if let scriptObject = NSAppleScript(source: scriptCode) {
var errorDict: NSDictionary? = nil
scriptOutput = scriptObject.executeAndReturnError(&errorDict)
if let error = errorDict {
print(error)
}
}
Y adaptando nuestro script de Swift con el script de AppleScript para usar VoiceOver el código quedaría de la siguiente forma:
import Foundation
let mensajeAVerbalizar = "Hola mundo!"
let scriptCode = """
tell application "VoiceOver"
output "\(mensajeAVerbalizar)"
end tell
"""
var scriptOutput: NSAppleEventDescriptor?
if let scriptObject = NSAppleScript(source: scriptCode) {
var errorDict: NSDictionary? = nil
scriptOutput = scriptObject.executeAndReturnError(&errorDict)
if let error = errorDict {
print(error)
}
}