3 votos

Alternar Bluetooth AppleScript no funciona en Yosemite

Antes de actualizar a Yosemite, utilizaba Keyboard Maestro para invocar este Applescript con un acceso directo:

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ó tal y como se esperaba, alternando el bluetooth cada vez que pulsaba mi acceso directo.

Sin embargo, ya no funciona con Yosemite, estoy seguro de que tiene algo que ver con que Apple haya cambiado el panel de Preferencias del Sistema o el orden de los iconos, pero no estoy seguro de qué cambiar. El atajo de Keyboard Maestro es invocando el archivo, porque escucho el sonido que le había asignado, así que definitivamente es algo con el script.

Esto es lo que obtengo en "Respuestas" cuando ejecuto esto en el editor script 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 causa el problema. Para depurar, he cambiado 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 sólo queda averiguar qué tipo de acción quiero ejecutar en este panel:

enter image description here

Actualización de las soluciones: ¡Gracias fartheraway! Ambos markhunte y lejos me funcionaron, pero elegí esta última porque era más parecida a mi código. Supongo que no se pueden elegir dos "mejores" respuestas. Me gustaría que hubiera una solución para hacer que funcione sin traer el panel de preferencias (visualmente) como mi script hizo con Mavericks, pero estos dos deben ser lo suficientemente bueno.

2voto

Malik hassan Puntos 16

Activación o desactivación simple que no necesita comprobar 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

2voto

user234133 Puntos 1

He aprendido mucho aquí, ¡espero que esta contribución ayude a alguien también! Encontré que usando "lanzar" en lugar de "activar" se abrirá la aplicación visiblemente, pero no como la ventana en primer plano. El otro truco, o al menos "algo que aprendí hace poco que era posible", es usar un bucle de repetición vacío para esperar a que se cargue la ventana (y por tanto que exista el botón) en lugar de un valor de "delay", que también uso para verificar que el cambio ha funcionado antes de mostrar una notificación. El resto de mi código consiste en retener el estado de System Preference si ya estaba abierto, o salir de él, en caso 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

1voto

Tim Brigham Puntos 8727

Respuesta actualizada/mejorada:

1) Este nuevo script no parpadea.

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

Para superar eso, una manera de llevar SysPref al frente, como en la respuesta original. O bien, ejecutar un bucle que vuelva a pulsar el botón (o por tercera vez) hasta que el Bluetooth esté realmente apagado. Por eso hay dos variables y un bucle en el script. Esto debería hacer que el script sea más fiable. statName registra el estado original. Loop continuará pulsando el botón hasta que el estado haya cambiado. failSafe hace que el script no se ejecute eternamente 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"

Desde Inspector de accesibilidad :

enter image description here

button 3 en el nº 6 de la lista. El 6º botón es el nº 11 de la lista. Cuando llame a button 6 La ventana de preferencias va a Genie. Supongo que Mavericks tenía todos los botones agrupados en la parte delantera.

1voto

Oll Puntos 452

Esta es 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

1voto

Brian Frost Puntos 6544

Aquí hay un sencillo Bluetooth script que utiliza blueutil (disponible a través de Homebrew), sin scripts de interfaz de usuario. Ajusta el blueutil según sea necesario para apuntar al blueutil binario si no estás instalando a través de Homebrew. Esto se basa libremente en un viejo script que tenía por ahí que incluía notificaciones Growl y que probablemente era originalmente de http://macosxhints.com (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

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X