Attiva / disattiva AppleScript Bluetooth che non funziona in Yosemite

1

Prima di passare a Yosemite, ho usato Keyboard Maestro per richiamare questo Apple Applescript con una scorciatoia:

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"

Si è comportato come previsto, attivando il bluetooth ogni volta che ho premuto il mio collegamento.

Non funziona più con Yosemite, sono sicuro che ha qualcosa a che fare con Apple cambiando il pannello delle Preferenze di Sistema o l'ordine delle icone, ma non sono sicuro di cosa cambiare. La scorciatoia Keyboard Maestro è che richiama il file, perché sento il suono che gli ho assegnato, quindi è decisamente qualcosa con lo script.

Ecco cosa trovo in "Risposte" quando eseguo questo in Script Editor di 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

Aggiornamenti:

Non è sicuramente il riquadro a causare il problema. Per eseguire il debug, ho modificato il codice in:

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

E apre correttamente il riquadro Bluetooth. Ora non resta che capire quale tipo di azione voglio eseguire su questo pannello:

Aggiornamentosullesoluzioni:Grazieadistanza!Entrambi markhunte e fartheraway hanno funzionato per me, ma ho scelto quest'ultimo perché era più simile al mio codice. Immagino che tu non possa scegliere due "migliori" risposte. Vorrei che ci fosse una soluzione per farlo funzionare senza far apparire il pannello delle preferenze (visivamente) come il mio script ha fatto con Mavericks, ma questi due dovrebbero essere abbastanza buoni.

    
posta zerohedge 22.10.2014 - 19:29
fonte

5 risposte

1

Aggiornamento / Risposta migliore:

1) Questo nuovo script non lampeggia.

2) Per ragioni sconosciute all'uomo e alla logica (o solo a me), a volte apple / scriptes / quasi sempre non riesce a Disattiva Bluetooth , se la finestra Preferenze di sistema è sullo sfondo. Invece di spegnere, ciò che accade in realtà è che Bluetooth si riabilita immediatamente, quindi il pannello si trova in uno stato nuovo : è acceso, ma senza connessioni.

Per superare questo, un modo per portare SysPref in primo piano, come nella risposta originale. In alternativa, esegui un ciclo che fa nuovamente clic sul pulsante (o per una terza volta) finché il Bluetooth non è realmente disattivato. Ecco perché ci sono due variabili e un ciclo nello script. Questo dovrebbe rendere lo script più affidabile. La variabile statName registra lo stato originale. Loop continuerà a fare clic sul pulsante fino a quando lo stato non cambia. failSafe si assicura che lo script non venga eseguito per sempre in caso di errore. Tutto a costo di estetica del codice.

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

Risposta originale:

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"

Da Ispettore accessibilità :

button 3 nella voce no.6 nell'elenco. Il 6 ° pulsante è il numero 11 nella lista. Quando chiami button 6 Preference Window fa Genie. Immagino che i Mavericks abbiano tutti i pulsanti ammucchiati in primo piano.

    
risposta data 22.10.2014 - 20:50
fonte
2

Ho imparato molto qui, spero che questo contributo aiuti anche qualcuno! Ho trovato che usare "lancia" invece di "attivare" aprirà l'app in modo visibile, ma non come finestra in primo piano. L'altro trucco, o almeno "la cosa pulita che ho imparato di recente era possibile", sta usando un ciclo di ripetizione vuoto per aspettare che la finestra carichi (e quindi il pulsante per esistere) invece di un valore di "delay", che uso anch'io per verificare la modifica ha funzionato prima di mostrare una notifica. Il resto del mio codice riguarda il mantenimento dello stato di System Preference se era già aperto, o lo interrompeva, altrimenti.

    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
    
risposta data 14.04.2017 - 21:11
fonte
2

Semplice attivazione o disattivazione che non è necessario controllare prima lo stato.

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
    
risposta data 22.10.2014 - 21:11
fonte
1

Ecco la mia risposta:

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
    
risposta data 09.11.2014 - 03:04
fonte
1

Ecco un semplice script Bluetooth che utilizza blueutil (disponibile tramite Homebrew), senza scripting dell'interfaccia utente. Regola la variabile blueutil come necessario per puntare al binario blueutil se non stai installando tramite Homebrew. Questo si basa liberamente su un vecchio script che avevo in giro che includeva le notifiche di Growl e probabilmente era originariamente dal link (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
    
risposta data 28.02.2015 - 04:22
fonte

Leggi altre domande sui tag