2 votes

Bug des services qui activent prématurément une application

J'ai découvert un bug très étrange avec les services.

Pour constater ce comportement, veuillez faire ce qui suit :

  • Assurez-vous que Safari se trouve dans votre Dock.

  • Ouvrez Automator. Créez un nouveau service.

  • Réglez le service pour qu'il ne reçoive "aucune entrée" dans "toute application".

  • Insérez une action "Exécuter AppleScript".

  • Collez le texte suivant dans l'action :

    on run {input, parameters}
    
        delay 5
        display dialog "Hello"      
        tell application "Safari" to activate
    
        return input
    end run
  • Sauvez le service.

  • Fermez le service.

  • Rouvrez le service.

  • Automator doit vous présenter une boîte de dialogue demandant : "Voulez-vous installer le service "NomService" ?". Cliquez sur "Installer".

  • Lorsque la boîte de dialogue "Installation terminée" apparaît, cliquez sur "Terminé".

Maintenant, exécutez le service. Pour ce faire, cliquez sur le titre de l'application en cours dans le coin supérieur gauche de l'écran (deuxième élément de la barre de menu). Cliquez ensuite sur le titre du service.

Vous remarquerez que Safari s'ouvre immédiatement (comme en témoigne le point noir sous son logo dans le Dock). Safari s'ouvre avant le délai de 5 secondes et avant l'affichage de la boîte de dialogue "Bonjour".

Placer le activate dans un sous-programme ne résout pas le problème.

Quelqu'un peut-il confirmer qu'il s'agit d'un bogue ? Je suis convaincu qu'il s'agit d'un bogue dans la fonction Services, car lorsque vous exécutez le service depuis Automator (en cliquant sur le bouton "play" dans le coin supérieur droit de la fenêtre Automator), le code s'exécute correctement.

S'il s'agit d'un bogue, quelqu'un a-t-il une solution de contournement pour que l'application ne soit pas ouverte avant l'exécution du code précédent ?


Mon Macbook Pro fonctionne sous OS X El Capitan, 10.11.6.


Ce bogue pourrait être lié à un autre comportement étrange que j'ai remarqué :

  • Quittez Safari.app et Automator.app, s'ils sont en cours d'exécution.

  • Affichez le dossier dans lequel les services de l'ordinateur sont stockés (/Users/Me/Library/Services/) dans le Finder.

  • Cliquez avec le bouton droit de la souris sur le fichier Service et ouvrez le fichier avec Automator.

Vous remarquerez que l'ouverture du fichier .workflow avec Automator activera Safari. Cela ne devrait pas être le cas.

2voto

user3439894 Points 52496

La seule solution de contournement que j'ai trouvée après avoir testé plusieurs scénarios différents est d'envelopper le fichier Safari commandes dans un do shell script commande par exemple do shell script "osascript -e 'tell application \"Safari\" to activate'" . Notez qu'avec osascript , multiples e options peut être donné pour construire un script de plusieurs lignes.

À partir de la page du manuel de osascript :

e déclaration

Entrez une ligne d'un script. Si e est donné, osascript ne cherchera pas de nom de fichier dans la liste des arguments. Multiple e des options peuvent être données pour construire un script multi-lignes. Parce que la plupart des script utilisent des caractères qui sont spéciaux à de nombreux programmes shell (par exemple, AppleScript utilise des guillemets simples et doubles, "(", ")", et "*"), la déclaration devra être correctement citée et échappée pour passer le shell intact.

Exemple d'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

Un exemple de l'AppleScript code ci-dessus, écrit comme un do shell script commande en utilisant osascript avec le -e option si nécessaire.

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

Comme vous pouvez le voir, chaque ligne d'AppleScript code de la normale tell déclaration de bloc est son propre -e option et comme indiqué dans la page de manuel de osascript avec le -e option l'échappement avec une barre oblique inversée a été fait comme nécessaire pour le système de gestion de l'information. code a compiler correctement avant d'être exécuté.

En d'autres termes, ce tour le normal tell déclaration de bloc et son inclus commandes en une ligne do shell script commande afin de contourner le bogue apparent dans le scénario d'utilisation présenté dans le PO.

Notez que vous devriez pouvoir faire de même avec d'autres applications déclenchées par le même bogue, en substituant l'application appropriée nom (et commandes ) selon les besoins.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X