Dienstfehler, der eine Anwendung vorzeitig aktiviert

Ich habe einen sehr seltsamen Fehler bei Services entdeckt.

Um dieses Verhalten zu beobachten, gehen Sie bitte wie folgt vor:

  • Stellen Sie sicher, dass sich Safari in Ihrem Dock befindet.

  • Automator öffnen. Erstellen Sie einen neuen Dienst.

  • Stellen Sie den Dienst so ein, dass er in „jeder Anwendung“ „keine Eingabe“ erhält.

  • Fügen Sie eine Aktion "AppleScript ausführen" ein.

  • Fügen Sie Folgendes in die Aktion ein:

    on run {input, parameters}
    
        delay 5
        display dialog "Hello"      
        tell application "Safari" to activate
    
        return input
    end run
    
  • Speichern Sie den Dienst.

  • Schließen Sie den Dienst.

  • Öffnen Sie den Dienst erneut.

  • Automator sollte Ihnen ein Dialogfeld mit der Frage anzeigen: „Möchten Sie den Dienst „ServiceName“ installieren?“ Klicken Sie auf „Installieren“.

  • Wenn das Dialogfeld „Installation abgeschlossen“ angezeigt wird, klicken Sie auf „Fertig“.

Führen Sie nun den Dienst aus. Klicken Sie dazu auf den Titel der aktuellen Anwendung in der oberen linken Ecke des Bildschirms (der zweite Punkt in der Menüleiste). Klicken Sie dann auf den Diensttitel.

Sie werden feststellen, dass Safari sofort geöffnet wird (erkennbar am schwarzen Punkt unter seinem Logo im Dock). Safari wird vor der 5-Sekunden-Verzögerung und vor der Anzeige des „Hallo“-Dialogs geöffnet.

Das Platzieren der activateAnweisung in einer Subroutine behebt das Problem nicht.

Kann jemand bestätigen, dass das ein Bug ist? Ich bin davon überzeugt, dass dies ein Fehler in der Dienstfunktion ist, denn wenn Sie den Dienst in Automator ausführen (indem Sie auf die Schaltfläche „Play“ in der oberen rechten Ecke des Automator-Fensters klicken), wird der Code korrekt ausgeführt.

Wenn dies ein Fehler ist, hat jemand eine Problemumgehung, damit die Anwendung tatsächlich nicht geöffnet wird, bevor der vorherige Code ausgeführt wird?


Auf meinem Macbook Pro läuft OS X El Capitan, 10.11.6.


Der Fehler könnte mit einem anderen seltsamen Verhalten zusammenhängen, das mir aufgefallen ist:

  • Beenden Sie Safari.app und Automator.app, falls sie ausgeführt werden.

  • Rufen Sie im Finder den Ordner auf, in dem die Dienste des Computers gespeichert sind (/Users/Me/Library/Services/).

  • Klicken Sie mit der rechten Maustaste auf die Service-Datei und öffnen Sie die Datei mit Automator.

Sie werden feststellen, dass das Öffnen der .workflow-Datei mit Automator Safari aktiviert. Das sollte es nicht tun.

Ich kann die Probleme replizieren, die Sie unter OS X El Capitan 10.11.6 beschrieben haben.
Danke für die Überprüfung @user3439894! Können Sie sich irgendwelche Problemumgehungen vorstellen?
Die einzige Problemumgehung, die ich nach dem Testen verschiedener Szenarien gefunden habe, besteht darin, die Safari-Befehle in einen Befehl einzuschließen do shell script, z do shell script "osascript -e 'tell application \"Safari\" to activate'". Beachten Sie, dass mit osascriptmehrere −e-Optionen angegeben werden können, um ein mehrzeiliges Skript aufzubauen.
Das funktioniert super! Wenn Sie das als Antwort posten, werde ich es akzeptieren. Und wenn es Ihnen nichts ausmacht, können Sie diesen letzten Satz ein wenig erweitern? Ich verstehe nicht wirklich, was es bedeutet.
Mir ist aufgefallen, dass das bloße Kompilieren eines AppleScripts, das enthält, tell application "Whatever" to ...diese App aktiviert. Das ist wahrscheinlich die zugrunde liegende Ursache.

Antworten (1)

Die einzige Problemumgehung, die ich nach dem Testen verschiedener Szenarien gefunden habe, besteht darin, die Safari- Befehle in einen do shell script Befehl einzuschließen , z do shell script "osascript -e 'tell application \"Safari\" to activate'". Beachten Sie, dass mit osascriptmehrere −e Optionen angegeben werden können, um ein mehrzeiliges Skript aufzubauen.

Aus der Handbuchseite für osascript:

−e- Anweisung

Geben Sie eine Zeile eines Skripts ein. Wenn −e angegeben ist, sucht osascript nicht nach einem Dateinamen in der Argumentliste. Es können mehrere −e- Optionen angegeben werden, um ein mehrzeiliges Skript aufzubauen. Da die meisten Skripte Sonderzeichen für viele Shell-Programme verwenden (z. B. verwendet AppleScript einfache und doppelte Anführungszeichen, „(“, „)“ und „*“), muss die Anweisung korrekt in Anführungszeichen gesetzt und mit Escapezeichen versehen werden, um sie zu erhalten vorbei an der Schale intakt.

Beispiel AppleScript -Code :

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

Ein Beispiel für den obigen AppleScript- Code , geschrieben als do shell script Befehl mit osascriptder -e Option , falls erforderlich.

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

Wie Sie sehen können, ist jede Zeile des AppleScript- Codes aus der normalen tell Blockanweisung ihre eigene -e Option , und wie in der Handbuchseite für osascriptdie -e Option angegeben , wurde bei Bedarf mit einem Backslash maskiert, damit der Code vor der Ausführung korrekt kompiliert wird .

Mit anderen Worten, dies verwandelt die normale tell Blockanweisung und die darin enthaltenen Befehle in einen einzeiligen do shell script Befehl , um den offensichtlichen Fehler in dem im OP vorgestellten Anwendungsfall-Szenario zu umgehen.

Beachten Sie, dass Sie in der Lage sein sollten, ähnliches mit anderen Anwendungen zu tun, die durch denselben Fehler ausgelöst werden, indem Sie den entsprechenden Anwendungsnamen ( und Befehle ) nach Bedarf ersetzen.

Danke für die Bereitstellung und Erläuterung eines Beispiels! Jetzt verstehe ich das Konzept.