Bug di servizio che attiva prematuramente un'applicazione

2

Ho scoperto un bug molto strano con Servizi.

Per verificare questo comportamento, eseguire le seguenti operazioni:

  • Assicurati che Safari si trovi nel Dock.

  • Apri Automator. Crea un nuovo servizio.

  • Imposta il servizio per ricevere "nessun input" in "nessuna applicazione".

  • Inserisci un'azione "Esegui AppleScript".

  • Incolla quanto segue nell'azione:

    on run {input, parameters}
    
        delay 5
        display dialog "Hello"      
        tell application "Safari" to activate
    
        return input
    end run
    
  • Salva il servizio.

  • Chiudi il servizio.

  • Riapri il servizio.

  • Automator dovrebbe presentarti una finestra di dialogo che chiede, "Vuoi installare il servizio" ServiceName "?" Fai clic su "Installa".

  • Quando viene visualizzata la finestra di dialogo "Installazione completata", fai clic su "Fine".

Ora, esegui il servizio. Per fare ciò, fare clic sul titolo dell'applicazione corrente nell'angolo in alto a sinistra dello schermo (il secondo elemento nella barra dei menu). Quindi fai clic sul titolo del servizio.

Noterai che Safari si aprirà immediatamente (evidenziato dal punto nero sotto il suo logo nel Dock). Safari aprirà prima del ritardo di 5 secondi e prima che venga visualizzata la finestra di dialogo "Ciao".

L'inserimento dell'istruzione activate in una subroutine non risolve il problema.

Qualcuno può confermare che si tratta di un bug? Sono convinto che si tratti di un bug della funzione Servizi perché quando si esegue il servizio da Automator (facendo clic sul pulsante "Riproduci" nell'angolo in alto a destra della finestra di Automator), il codice viene eseguito correttamente.

Se si tratta di un bug, qualcuno ha una soluzione alternativa in modo che l'applicazione non venga effettivamente aperta prima dell'esecuzione del codice precedente?

Il mio Macbook Pro esegue OS X El Capitan, 10.11.6.

Il bug potrebbe essere correlato a un altro comportamento strano che ho notato:

  • Esci da Safari.app e Automator.app, se sono in esecuzione.

  • Apri la cartella in cui sono memorizzati i Servizi del computer (/ Utenti / Me / Libreria / Servizi /) nel Finder.

  • Fai clic con il pulsante destro del mouse sul file del servizio e apri il file con Automator.

Noterai che l'apertura del file .workflow con Automator attiverà Safari. Non dovrebbe farlo.

    
posta rubik's sphere 31.01.2017 - 21:15
fonte

1 risposta

2

L'unica soluzione che ho trovato dopo aver provato diversi scenari è quella di avvolgere i comandi di Safari in un comando% em_de% , ad es. %codice%. Tieni presente che con do shell script , possono essere fornite più do shell script "osascript -e 'tell application \"Safari\" to activate'" opzioni per creare uno script su più righe.

Dalla pagina di manuale per osascript :

−e statement

Enter one line of a script. If −e is given, osascript will not look for a filename in the argument list. Multiple −e options may be given to build up a multi-line script. Because most scripts use characters that are special to many shell programs (e.g., AppleScript uses single and double quote marks, “(”, “)”, and “*”), the statement will have to be correctly quoted and escaped to get it past the shell intact.

Esempio di codice 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 esempio del code di AppleScript sopra, scritto come −e comando utilizzando osascript con l'opzione do shell script , se necessario.

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'"

Come puoi vedere, ogni riga di code di AppleScript dalla normale osascript istruzione di blocco è la propria -e opzione , e come indicato nella pagina di manuale per tell con l'opzione -e , l'escape con una barra rovesciata è stato eseguito come necessario per il codice per compilazione correttamente prima di essere eseguito.

In altre parole, questo trasforma la normale osascript istruzione del blocco e i suoi comandi inclusi in un comando di riga -e in modo da aggirare l'errore apparente nello scenario del caso d'uso presentato nell'OP.

Nota che dovresti essere in grado di fare lo stesso con altre applicazioni innescate dallo stesso bug, sostituendo l'appropriata nome (e comandi ) secondo necessità.

    
risposta data 03.02.2017 - 22:54
fonte

Leggi altre domande sui tag