Error de servicios que activa prematuramente una aplicación

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 activatedeclaració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.

Puedo replicar los problemas que ha descrito en OS X El Capitan 10.11.6.
¡Gracias por consultar a @user3439894! ¿Se te ocurre alguna solución?
La única solución que encontré después de probar varios escenarios diferentes es envolver los comandos de Safari dentro de un do shell scriptcomando, por ejemplo do shell script "osascript -e 'tell application \"Safari\" to activate'", . Tenga en cuenta que con osascript, se pueden dar múltiples opciones −e para crear un script de varias líneas.
¡Eso funciona muy bien! Si publicas eso como respuesta, lo aceptaré. Además, si no te importa, ¿puedes ampliar un poco la oración final? Realmente no entiendo lo que significa.
Me di cuenta de que simplemente compilar un AppleScript que contiene tell application "Whatever" to ...activará esa aplicación. Esa es probablemente la causa subyacente.

Respuestas (1)

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 osascriptla -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 osascriptcon 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.

¡Gracias por proporcionar y explicar un ejemplo! Ahora entiendo el concepto.