Toggle Bluetooth AppleScript no funciona en Yosemite

1

Antes de actualizar a Yosemite, usé Keyboard Maestro para invocar este Applescript con un atajo:

tell application "System Preferences"
    reveal pane "com.apple.preferences.Bluetooth"
end tell
tell application "System Events" to tell process "System Preferences"
    click button 6 of window 1
end tell
quit application "System Preferences"

Se comportó como se esperaba, alternando bluetooth cada vez que presioné mi acceso directo.

Sin embargo, ya no funciona con Yosemite, estoy seguro de que tiene algo que ver con que Apple cambie el panel de Preferencias del sistema o el orden de los iconos, pero no estoy seguro de qué cambiar. El acceso directo de Keyboard Maestro está invocando el archivo, porque escucho el sonido que le había asignado, por lo que definitivamente es algo con el script.

Esto es lo que obtengo en "Respuestas" cuando ejecuto esto en el Editor de secuencias de comandos de Apple:

tell application "System Preferences"
    reveal pane "com.apple.preferences.Bluetooth"
        --> missing value
end tell
tell application "System Events"
    click button 6 of window 1 of process "System Preferences"
        --> button 6 of window "Bluetooth" of application process "System Preferences"
end tell
tell application "Script Editor"
    quit
end tell

Actualizaciones :

Definitivamente no es el panel el que está causando el problema. Para depurar, cambié el código a:

tell application "System Preferences"
    set current pane to pane id "com.apple.preferences.bluetooth"
end tell

Y abre correctamente el panel de Bluetooth. Ahora todo lo que queda es averiguar qué tipo de acción quiero ejecutar en este panel:

Actualizaciónsobresoluciones:¡Gracias,lejos!Ambos markhunte 's y fartheraway funcionaron para mí, pero elegí esta última porque era más similar a mi código. Supongo que no puedes elegir dos "mejores" respuestas. Me gustaría que hubiera una solución para que funcionara sin abrir el panel de preferencias (visualmente) como lo hizo mi script con Mavericks, pero estos dos deberían ser lo suficientemente buenos.

    
pregunta zerohedge 22.10.2014 - 19:29

5 respuestas

1

Respuesta actualizada / mejor:

1) Esta nueva secuencia de comandos no parpadea.

2) Por razones desconocidas para el hombre y la lógica (o solo para mí), Applecript a veces / casi siempre falla en Desactivar Bluetooth , si la Ventana de preferencias del sistema es en el fondo. En lugar de apagarse, lo que realmente ocurre es que Bluetooth se vuelve a habilitar de inmediato, por lo que el panel se encuentra en un estado fresco : está ENCENDIDO, pero no hay conexiones.

Para superar eso, una forma de llevar a SysPref al frente, como en la respuesta original. O bien, ejecute un bucle que haga clic nuevamente en el botón (o por tercera vez) hasta que Bluetooth esté realmente apagado. Es por eso que hay dos variables y un bucle en el script. Esto debería hacer que el script sea más confiable. La variable statName registra el estado original. Loop continuará haciendo clic en el botón hasta que el estado cambie. failSafe se asegura de que el script no se ejecute para siempre en caso de error. Todo a costa de la estética del código.

tell application "System Events"

    tell process "System Preferences"
        activate
    end tell

    tell application "System Preferences"
        set current pane to pane "com.apple.preferences.Bluetooth"
    end tell

    tell process "System Preferences"

        set statName to name of button 3 of window 1 as string
        set failSafe to 0

        repeat until statName is not name of button 3 of window 1 as string ¬
            or failSafe is 10
            click button 3 of window 1
            set failSafe to failSafe + 1
            delay 0.1
        end repeat

    end tell

    tell application "System Preferences"
        quit
    end tell

end tell

Respuesta original:

tell application "System Preferences"
    activate --Change 1/2
    reveal pane "com.apple.preferences.Bluetooth"
end tell
tell application "System Events" to tell process "System Preferences"
    click button 3 of window 1 --Change 2/2
end tell
quit application "System Preferences"

De Inspector de accesibilidad :

button 3 en el elemento no.6 de la lista. El sexto botón es no.11 en la lista. Cuando llamas a button 6 , la ventana de preferencias se convierte en Genie. Supongo que Mavericks tenía todos los botones agrupados en la parte delantera.

    
respondido por el fartheraway 22.10.2014 - 20:50
2

He aprendido mucho aquí, ¡espero que esta contribución también ayude a alguien! Descubrí que usar "iniciar" en lugar de "activar" abrirá la aplicación visiblemente, pero no como la ventana de primer plano. El otro truco, o al menos "lo mejor que aprendí recientemente fue posible", es usar un ciclo de repetición vacío para esperar a que se cargue la ventana (y así el botón exista) en lugar de un valor de "retardo", que también uso para verificar el cambio trabajado antes de mostrar una notificación. El resto de mi código se trata de mantener el estado de Preferencia del sistema si ya estaba abierto, o salir de él, de lo contrario.

    set bundleID to "com.apple.systempreferences"

-- Check for System Preferences running already
tell the application "System Events" to set runningApps to (bundle identifier of every application process)
if bundleID is in runningApps then
    set stayOpen to true
else
    set stayOpen to false
end if

tell application id "com.apple.systempreferences"
    -- Problem with this setting is that the toggle doesn't work if the prefPane is open in the background — the window /must/ be visible
    if not (stayOpen) then launch

    -- If it's already running, save the current prefPane for later
    if (stayOpen) then set prevPane to current pane

    set current pane to pane id "com.apple.preferences.bluetooth"
end tell

tell the application "System Events"
    -- An empty repeat loop to keep checking for the window
    -- Here I am lazy and don't use the identifier
    repeat until window "Bluetooth" of process "System Preferences" exists
    end repeat

    tell window "Bluetooth" of process "System Preferences"
        if button "Turn Bluetooth Off" exists then
            -- Click and wait for it to change, then send a notification
            click button "Turn Bluetooth Off"
            repeat until button "Turn Bluetooth On" exists
            end repeat
            display notification "Bluetooth Off"
        else
            click button "Turn Bluetooth On"
            repeat until button "Turn Bluetooth Off" exists
            end repeat
            display notification "Bluetooth On"
        end if
    end tell

end tell

tell application id "com.apple.systempreferences"
    if (stayOpen) then
        if prevPane is not missing value then set current pane to prevPane
    else if not (stayOpen) then
        quit
    end if
end tell
    
respondido por el gopy 14.04.2017 - 21:11
2

Activación o desactivación simple que no necesita verificar el estado primero.

property thePane : "com.apple.preferences.bluetooth"

tell application "System Preferences"
    activate
    set the current pane to pane id thePane
    --delay 1
end tell

tell application "System Events"
    tell application process "System Preferences"
        try
            click button "Turn Bluetooth Off" of window "Bluetooth"
        on error
            click button "Turn Bluetooth On" of window "Bluetooth"
        end try
    end tell
end tell

tell application "System Preferences" to quit
    
respondido por el markhunte 22.10.2014 - 21:11
1

Aquí está mi respuesta:

tell application "System Preferences"
    reveal pane id "com.apple.preferences.Bluetooth"
    -- activate

    set the current pane to pane id "com.apple.preferences.Bluetooth"

    try
        tell application "System Events" to tell process "System Preferences"
            click button "Turn Bluetooth Off" of window "Bluetooth"

            click button "Turn Bluetooth Off" of sheet 1 of window "Bluetooth" of application process "System Preferences" of application "System Events"
        end tell

        delay 1

    on error
        tell application "System Events" to tell process "System Preferences"
            click button "Turn Bluetooth On" of window "Bluetooth"
            quit
        end tell

    end try

end tell
    
respondido por el Matt 09.11.2014 - 03:04
1

Aquí hay un simple script Bluetooth que usa blueutil (disponible a través de Homebrew), sin scripts de UI. Ajuste la variable blueutil según sea necesario para señalar el binario blueutil si no está instalando a través de Homebrew. Esto se basa libremente en una secuencia de comandos antigua que tenía, que incluía notificaciones de Growl y probablemente fue originalmente de enlace (RIP).

set blueutil to "/usr/local/bin/blueutil"
set powerStatus to do shell script blueutil & " power"

if powerStatus is "1" then
    do shell script blueutil & " power 0"
else if powerStatus is "0" then
    do shell script blueutil & " power 1"
end if
    
respondido por el Cottser 28.02.2015 - 04:22

Lea otras preguntas en las etiquetas