Error de servicios que activa prematuramente una aplicación

2

He descubierto un error muy extraño con los Servicios.

Para presenciar este comportamiento, haga lo siguiente:

  • Asegúrese de que Safari está en su Dock.

  • Abre Automator. Crea un nuevo servicio.

  • Configura el servicio para que reciba "ninguna entrada" en "cualquier aplicación".

  • Inserta 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
    
  • Guarda el servicio.

  • Cerrar el servicio.

  • Vuelva a abrir el Servicio.

  • Automator debería presentarle un cuadro de diálogo que le pregunta: "¿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 abrirá antes del retraso de 5 segundos y antes de que se muestre el cuadro de diálogo "Hola".

Colocar la declaración activate en una subrutina no soluciona el problema.

¿Puede alguien confirmar que esto es un error? Estoy convencido de que se trata de un error en la función Servicios porque cuando ejecuta el Servicio desde Automator (haciendo clic en el botón "jugar" en la esquina superior derecha de la ventana de Automator), el código se ejecuta correctamente.

Si se trata de 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 está ejecutando 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 están almacenados los Servicios de la computadora (/ Users / Me / Library / Services /) en Finder.

  • Haga clic con el botón derecho en el archivo de Servicio y abra el archivo con Automator.

Observará que al abrir el archivo .workflow con Automator se activará Safari. No debería hacer eso.

    
pregunta rubik's sphere 31.01.2017 - 21:15

1 respuesta

2

La única solución que he encontrado después de probar varios escenarios diferentes es envolver los comandos de Safari dentro de un comando de do shell script , por ejemplo. %código%. Tenga en cuenta que con do shell script "osascript -e 'tell application \"Safari\" to activate'" , se pueden otorgar múltiples osascript opciones para crear un script de varias líneas.

Desde la página del manual para −e :

  

−e statement

     

Introduzca una línea de un script. 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 multilínea. Debido a que la mayoría de los scripts usan caracteres que son especiales para muchos programas shell (por ejemplo, AppleScript usa comillas simples y dobles, "(", ")", y "*"), la declaración tendrá que ser correctamente citada y escapada para obtenerla. pasado el shell intacto.

Ejemplo de código de 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 de AppleScript anterior, escrito como un comando osascript usando do shell script con la opción osascript , 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 del código de AppleScript de la declaración de bloque normal -e es su propia opción tell , y como se indica en la página del manual para -e con la opción osascript , el escape con una barra invertida se realizó según sea necesario para el código para compilar correctamente antes de ser ejecutado.

En otras palabras, esto convierte el -e declaración de bloque normal y sus comandos incluidos en una línea tell comando para evitar el error aparente en el caso de uso presentado en el OP.

Tenga en cuenta que debería poder hacer lo mismo con otras aplicaciones activadas por el mismo error, sustituyendo la aplicación apropiada nombre (y comandos ) según sea necesario.

    
respondido por el user3439894 03.02.2017 - 22:54

Lea otras preguntas en las etiquetas