He descubierto un error muy extraño con los Servicios.
Para presenciar este comportamiento, haga lo siguiente:
Asegúrate de que Safari esté en tu Dock.
Automatizador abierto. Crear un nuevo Servicio.
Configure el servicio para recibir "sin entrada" en "cualquier aplicación".
Inserte una acción "Ejecutar AppleScript".
Pegue lo siguiente en la acción:
on run {input, parameters}
delay 5
display dialog "Hello"
tell application "Safari" to activate
return input
end run
Guarde el Servicio.
Cierra el Servicio.
Vuelva a abrir el Servicio.
Automator debería presentarle un cuadro de diálogo que le pregunte: "¿Desea instalar el servicio "ServiceName"?" Haz clic en "Instalar".
Cuando aparezca el cuadro de diálogo "Instalación completa", haz clic en "Listo".
Ahora, ejecuta el Servicio. Para hacer esto, haga clic en el título de la aplicación actual en la esquina superior izquierda de la pantalla (el segundo elemento en la barra de menú). Luego haga clic en el título del Servicio.
Notarás que Safari se abrirá inmediatamente (evidenciado por el punto negro debajo de su logotipo en el Dock). Safari se abrirá antes del retraso de 5 segundos y antes de que se muestre el cuadro de diálogo "Hola".
Colocar la activate
declaración en una subrutina no soluciona el problema.
¿Alguien puede confirmar que esto es un error? Estoy convencido de que se trata de un error con la función Servicios porque cuando ejecuta el Servicio desde dentro de Automator (haciendo clic en el botón "reproducir" en la esquina superior derecha de la ventana de Automator), el código se ejecuta correctamente.
Si esto es un error, ¿alguien tiene una solución para que la aplicación no se abra antes de que se ejecute el código anterior?
Mi Macbook Pro ejecuta OS X El Capitan, 10.11.6.
El error podría estar relacionado con otro comportamiento extraño que noté:
Salga de Safari.app y Automator.app, si se están ejecutando.
Abra la carpeta donde se almacenan los Servicios de la computadora (/Users/Me/Library/Services/) en Finder.
Haga clic derecho en el archivo de servicio y abra el archivo con Automator.
Notará que abrir el archivo .workflow con Automator activará Safari. No debería hacer eso.
La única solución que encontré después de probar varios escenarios diferentes es envolver los comandos de Safari dentro de un do shell script
comando , por ejemplo do shell script "osascript -e 'tell application \"Safari\" to activate'"
. Tenga en cuenta que con osascript
, se pueden dar varias −e
opciones para crear un script de varias líneas.
Desde la página del manual para osascript
:
−e declaración
Introduzca una línea de un guión. Si se da −e , osascript no buscará un nombre de archivo en la lista de argumentos. Se pueden dar múltiples opciones de −e para construir un script de varias líneas. Debido a que la mayoría de las secuencias de comandos usan caracteres que son especiales para muchos programas de shell (por ejemplo, AppleScript usa comillas simples y dobles, "(", ")" y "*"), la declaración deberá estar entre comillas y escape correctamente para obtenerla. pasado el caparazón intacto.
Ejemplo de código AppleScript :
tell application "Safari"
activate
make new document in front
set URL of front document to "http://apple.stackexchange.com/questions/271133/services-bug-that-prematurely-activates-an-application"
end tell
Un ejemplo del código AppleScript anterior, escrito como un do shell script
comando con osascript
la -e
opción , según sea necesario.
do shell script "osascript -e 'tell application \"Safari\"' -e 'activate' -e 'make new document in front' -e 'set URL of front document to \"http://apple.stackexchange.com/questions/271133/services-bug-that-prematurely-activates-an-application\"' -e 'end tell'"
Como puede ver, cada línea de código AppleScript de la tell
instrucción de bloque normal es su propia -e
opción , y como se indica en la página del manual osascript
con la -e
opción , se ha realizado el escape con una barra invertida según sea necesario para que el código se compile correctamente antes de ejecutarse. .
tell
En otras palabras, esto convierte la declaración de bloque normal y sus comandos incluidos en un do shell script
comando de una línea para evitar el error aparente en el escenario de caso de uso presentado en el OP.
Tenga en cuenta que debería poder hacer lo mismo con otras aplicaciones desencadenadas por el mismo error, sustituyendo el nombre de la aplicación (y los comandos ) apropiados según sea necesario.
usuario3439894
esfera de rubik
usuario3439894
do shell script
comando, por ejemplodo shell script "osascript -e 'tell application \"Safari\" to activate'"
, . Tenga en cuenta que conosascript
, se pueden dar múltiples opciones −e para crear un script de varias líneas.esfera de rubik
BolígrafoBen
tell application "Whatever" to ...
activará esa aplicación. Esa es probablemente la causa subyacente.