Cómo ejecutar un script de AppleScript desde Swift

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)
    }
}

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.