¿Cómo ejecutar AppleScript personalizado en segundo plano en todo momento?

Dado un archivo AppleScript diseñado para buscar un cuadro de diálogo de aplicación cada 30 segundos, ¿cómo puedo configurar fácilmente mi sistema operativo Mac para que este archivo AppleScript se inicie cada vez que inicie sesión en segundo plano?

El código para el script (en caso de que esté interesado) se incluye a continuación y está diseñado para hacer clic en "Más tarde" en la aplicación AirMail Beta:

repeat
    if (exists application "AirMail Beta") then
        tell application "System Events" to tell process "Airmail Beta"
            if exists (button "Later" of front window) then
                click (button "Later" of front window)
            end if
        end tell
    end if
    delay 30
end repeat

El script anterior funciona, pero si alguien puede pensar en una mejor manera de hacer clic automáticamente en un cuadro de diálogo sin escribir un AppleScript que sondee cada pocos segundos, siéntase libre de ofrecer esa solución en los comentarios. Principalmente, sin embargo, me gustaría saber cuál es la mejor manera de administrar los AppleScripts diseñados para ejecutarse continuamente, de modo que puedan habilitarse/deshabilitarse e iniciarse sin que se vean al iniciar sesión automáticamente.

Respuestas (4)

En mi opinión, la mejor manera de hacerlo es usando el programador de tareas de Apple: launchd, porque no necesitas instalar software de terceros. Primero, la teoría: para ejecutar un script desde la línea de comando, simplemente ejecute:

osascript /PATH/TO/YOUR/script.scpt

Sabiendo esto, todo lo que tienes que hacer es crear un plistarchivo ~/Library/LaunchAgents/con esto:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>air-mail-beta.job</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/osascript</string>
        <string>/PATH/TO/YOUR/SCRIPT</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

El nombre del plistarchivo no importa, pero debe estar en formato ~/Library/LaunchAgents/. Además, asegúrese de cambiar /PATH/TO/YOUR/SCRIPTen consecuencia.

Finalmente, solo necesita decir launchdque desea que este script se ejecute siempre. Para hacer eso, solo tienes que hacer:

launchctl load -w ~/Library/LaunchAgents/NAME-OF-YOUR-PLIST.plist

¡y tu estas listo! Si parece que el script no se inició, puede hacer esto:

 launchctl start air-mail-beta.job

donde air-mail-beta.jobestá la propiedad debajo <key>label</key>de la que hemos establecido en el plistarchivo.

Finalmente, si alguna vez necesita deshabilitar el script, no olvide hacerlo unloadcon:

launchctl unload -w ~/Library/LaunchAgents/NAME-OF-YOUR-PLIST.plist

Sé que esta solución es más técnica, pero confía en mí, es una mejor forma de solucionar tu problema. ¡Si tienes alguna pregunta solo pregunta!

Gracias por esta solución. ¿ Puede el nombre del .jobser cualquier cosa en el .plistarchivo? Intenté crear una configuración personalizada .plisty parece cargar con éxito el .plistwith launchhd, pero el script en sí no parece iniciarse. No recibo comentarios en la Terminal cuando lo hago launchctldespués. Sé que el script funciona porque si simplemente osascript /PATH/to/script.scptlo hago, hace lo que se supone que debe hacer.
Experimentando exactamente el mismo problema que @Winterflags

Paso uno:

Al guardar el script en el editor de scripts, guárdelo como un paquete de aplicaciones y luego agréguelo a los elementos de inicio en las preferencias del sistema de inicio de sesión.

Paso dos "Antecedentes"

Utilice una aplicación iBackground Scripts para Mac

Simplemente arrastre y suelte un AppleScript que se haya guardado como un 'paquete de aplicaciones' en este droplet. Al hacer clic en el botón 'Sí', la secuencia de comandos se configurará para que se ejecute en segundo plano y no se mostrará en el Dock.

No estoy seguro de cómo funciona iBackground, pero dependiendo de la configuración que esté cambiando en la información del script guardado, plist, la aplicación puede ejecutarse en segundo plano, lo que significa que no puede salir fácilmente porque ahora actúa como un proceso y no muestra la interfaz gráfica de usuario.
Puede revertirlo haciendo clic en el botón 'No' y ya no será un script de fondo y se mostrará en el Dock. Si no ve el cambio inmediatamente, mueva el AppleScript a otra ubicación (Comando+arrastrar).
¿Está confirmando si desea salir de ella? No puede hacerlo a través de la GUI si usa esta aplicación para realizar el cambio a una aplicación en segundo plano.

Tuve el mismo problema. Estaba tratando de hacer clic en el botón "Aceptar" en kontakt en segundo plano mientras usaba mi computadora. Esto terminó funcionando para mí.

tell application "System Events"
    if exists of application process "Kontakt 5" then
        tell application "Kontakt 5.6.0" to activate
        delay 0.5
        repeat
            try
                click UI element "OK" of window 1 of application process "Kontakt 5"
            end try
        end repeat
    end if
end tell

Puede agregar una rutina de parada a su script de fondo. Luego escribe otra secuencia de comandos para invocar el tope de su rutina en segundo plano... Se requiere algo de ensamblaje.

cómo invocar la instrucción stringSet on de otro script:

on run
    set myApp to "/Applications/applescriptFiles/demo -- the best/b.app"
    -- some hocus pocus is nesessary to avoid applescript from change path.
    -- set myApp to POSIX file myApp

    tell application myApp

        launch
        stringSet("stringie set") -- this function is in the "b" app.
    end tell
end run


(* 

save this as an application bundle 

invoked by a.app.  

twtwtw write in:
https://discussions.apple.com/thread/4917321?start=15&tstart=0

hocus-pocus: 

Give your script application a unique bundle id string (CFBundleIdentifier) and a unique bundle name (CFBundleName) too, to make life easier.  You set those in the info.plist file.  Launch the script app once to register it with launch services, and system will be able to find it thereafter.

Example:
      <key>CFBundleIdentifier</key>
      <string>com.rccharles.b</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string>b</string>

    I added the CFBundleIdentifier info above the CFBundleInfoDictionaryVersion line. I left the CFBundleInfoDictionaryVersion and CFBundleName as is.

    *)

property myVar : "initial value"

on run
    display dialog myVar
end run

on stringSet(inputVar)
    set myVar to inputVar
    display dialog "variable myVar is " & myVar
end stringSet