{"id":725,"date":"2020-05-27T09:00:23","date_gmt":"2020-05-27T07:00:23","guid":{"rendered":"http:\/\/programaraciegas.net\/?p=725"},"modified":"2020-05-26T17:16:33","modified_gmt":"2020-05-26T15:16:33","slug":"como-ejecutar-un-script-de-applescript-desde-swift","status":"publish","type":"post","link":"https:\/\/programaraciegas.net\/?p=725","title":{"rendered":"C\u00f3mo ejecutar un script de AppleScript desde Swift"},"content":{"rendered":"<p>Aunque lenguajes de programaci\u00f3n como Swift, Objective-C o Java nos permiten crear aplicaciones para Mac potentes y r\u00e1pidas a veces hay funciones que AppleScript si puede hacer y otros lenguajes para Mac no pueden.<\/p>\n<p>Un ejemplo de algo que AppleScript puede hacer con facilidad es consultar el estado y modificar el comportamiento de otra aplicaci\u00f3n. Esto se debe a que muchas aplicaciones de MacOS incluyen librer\u00edas y diccionarios de soporte de AppleScript para que el propio sistema operativo pueda entablar comunicaciones con las aplicaciones.<\/p>\n<p>Dentro de una aplicaci\u00f3n podemos mezclar lenguajes de programaci\u00f3n para conseguir los beneficios de todos ellos. Por ejemplo, crear un script en Swift que ejecute un script de AppleScript para manipular una aplicaci\u00f3n.<\/p>\n<p><!--more--><\/p>\n<h2>Hacer hablar a VoiceOver desde Swift a trav\u00e9s de AppleScript<\/h2>\n<p>Aunque con Swift tenemos acceso a las librer\u00edas de s\u00edntesis de voz del sistema no podemos directamente controlar a VoiceOver, el lector de pantallas para Mac, para que verbalice un mensaje con la configuraci\u00f3n de habla definida por el usuario o mostrar el mensaje en una l\u00ednea braille. Para realizar estas operaciones es necesario que a trav\u00e9s de un script de AppleScript nos comuniquemos con VoiceOver.<\/p>\n<h3>El script de AppleScript que vamos a ejecutar<\/h3>\n<p>El script de AppleScript que necesitamos ejecutar es muy sencillo:<\/p>\n<p><code><br \/>\non sayWithVoiceOver(textToSay)<br \/>\n\ttry<br \/>\n\t\ttell application \"VoiceOver\"<br \/>\n\t\t\toutput textToSay<br \/>\n\t\tend tell<br \/>\n\ton error<br \/>\n\t\tsay textToSay<br \/>\n\tend try<br \/>\nend sayWithVoiceOver<br \/>\n<\/code><\/p>\n<p>En esa funci\u00f3n llamada <em>sayWithVoiceOver<\/em> llamamos a la aplicaci\u00f3n VoiceOver para usar sus funciones de <strong>Output<\/strong> para mostrar el mensaje por la l\u00ednea braille y usando la voz por defecto de VoiceOver.<\/p>\n<h3>El script en Swift<\/h3>\n<p>En Swift podemos utilizar la clase <em>NSAppleScript<\/em> para acceder al espacio de ejecuci\u00f3n de AppleScript que nos proporciona MacOS.<\/p>\n<p>Veamos un sencillo ejemplo usando el comando <em>say<\/em> de AppleScript.<\/p>\n<pre><code>\r\nimport Foundation\r\n\r\nlet scriptCode = \"\"\"\r\nsay \"Hola mundo\"\r\n\"\"\"\r\n\r\nvar scriptOutput: NSAppleEventDescriptor?\r\n\r\nif let scriptObject = NSAppleScript(source: scriptCode) {\r\n    var errorDict: NSDictionary? = nil\r\n    scriptOutput = scriptObject.executeAndReturnError(&errorDict)\r\n    if let error = errorDict {\r\n        print(error)\r\n    }\r\n}\r\n<\/code><\/pre>\n<p>Y adaptando nuestro script de Swift con el script de AppleScript para usar VoiceOver el c\u00f3digo quedar\u00eda de la siguiente forma:<\/p>\n<pre><code>\r\nimport Foundation\r\nlet mensajeAVerbalizar = \"Hola mundo!\"\r\nlet scriptCode = \"\"\"\r\n\t\ttell application \"VoiceOver\"\r\n\t\t\toutput \"\\(mensajeAVerbalizar)\"\r\n\t\tend tell\r\n\"\"\"\r\n\r\nvar scriptOutput: NSAppleEventDescriptor?\r\n\r\nif let scriptObject = NSAppleScript(source: scriptCode) {\r\n    var errorDict: NSDictionary? = nil\r\n    scriptOutput = scriptObject.executeAndReturnError(&errorDict)\r\n    if let error = errorDict {\r\n        print(error)\r\n    }\r\n}\r\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Aunque lenguajes de programaci\u00f3n como Swift, Objective-C o Java nos permiten crear aplicaciones para Mac potentes y r\u00e1pidas 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\u00f3n. &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/programaraciegas.net\/?p=725\" class=\"more-link\">Continuar leyendo<span class=\"screen-reader-text\"> \u00abC\u00f3mo ejecutar un script de AppleScript desde Swift\u00bb<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[80,38,258],"tags":[20,263,82,259],"class_list":["post-725","post","type-post","status-publish","format-standard","hentry","category-applescript","category-macos-x","category-swift","tag-apple","tag-macos","tag-script","tag-swift"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/posts\/725","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=725"}],"version-history":[{"count":0,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=\/wp\/v2\/posts\/725\/revisions"}],"wp:attachment":[{"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=725"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=725"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/programaraciegas.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=725"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}