So greifen Sie in einer in Automator erstellten URL-Handler-Anwendung auf eine angeklickte URL zu

14

Ich versuche derzeit, das Verhalten der Standard-URL-Verarbeitung in OS X zu ändern. Wenn ich auf einen Link außerhalb eines Webbrowsers klicke, möchte ich diese URL in das Pasteboard kopieren, anstatt sie beispielsweise im Standard-Webbrowser zu öffnen Wenn Sie in einer Skype-Konversation auf einen Link klicken, sollte diese URL in das OS X-Pasteboard kopiert werden, anstatt sie in Firefox (derzeit mein Standardwebbrowser) zu öffnen.

Ich habe über Lösungen nachgedacht, kann aber derzeit keine implementieren. Wenn ich eine Anwendung erstellen kann, die URLs in das Pasteboard einfügt, die an sie gesendet werden, und diese Anwendung als Standardwebbrowser festlegen kann, kann ich mein Ziel erreichen.

Ich habe mit Automator eine Anwendung erstellt, die den Shell-Befehl ausführt, pbcopyund diese Anwendung als Standard-Webbrowser festgelegt, aber ich habe nicht das erwartete Ergebnis erhalten. Ich habe einige Tests durchgeführt und kann bestätigen, dass die Anwendung beim Klicken auf einen Link ausgeführt wird. Die URL kann jedoch nicht an das Anwendungs- / Shell-Skript übergeben werden. Ich habe sowohl Standard als auch ein bestandenes Argument ausprobiert, aber ohne Erfolg.

Gibt es eine Möglichkeit für eine mit Automator erstellte Anwendung, eine angeklickte URL abzurufen und an diese zu senden pbcopy, wenn diese Anwendung als (Standard-) Handler für URLs festgelegt ist?

Gibt es eine bessere Möglichkeit, einen gefälschten Webbrowser zu erstellen, der die Eingaben aufnimmt und in das Pasteboard einfügt als Automator? Oder gibt es eine andere Möglichkeit, mein Ziel ohne eine benutzerdefinierte Anwendung / ein benutzerdefiniertes Skript zu erreichen?

DjDCH
quelle
Dies ist keine Antwort, da es keine vollständige Lösung ist, sondern ein Anfang. Ich habe rubicode.com/Software/RCDefaultApp verwendet , um eine Automator-Anwendung als Standardbrowser festzulegen . In Automator gibt es eine Aktion zum Kopieren in die Zwischenablage. Ich kann einfach keinen Text in eine Automator-App eingeben.
Pinguinrob
Dito, aber ich habe Choosy benutzt. Ich habe eine ganze Reihe von Tests durchgeführt und Folgendes festgestellt: 1) Die Automator-App wird ausgeführt. 2) Es scheint überhaupt keine Eingabe zu bekommen. 3) Ergo, wenn einem Browser ein "Link" gesendet wird, wird ihm keine URL im Klartext gesendet. Dies muss anders gehandhabt werden, und genau darum geht es.
Timothy Mueller-Harder

Antworten:

13

Die Art und Weise, wie URLs unter Mac OS X geöffnet werden, ist komplizierter als Sie denken. Wenn Sie auf eine URL klicken, übergibt Mac OS X dem Browser nicht nur die zu öffnende URL. Stattdessen sendet es ein Apple-Ereignis mit der ID kAEGetURL, die die URL enthält.

Ich habe Automator nie wirklich benutzt (es ist einfach viel zu langsam und für meinen typischen Gebrauch zu begrenzt), daher bin ich mir nicht sicher, aber ich bezweifle, dass es Apple Events verarbeiten kann. Daher können Sie Automator nicht verwenden, um das zu erreichen, was Sie wollen.

Sie müssen daher in Xcode auf eine normale Objective-C-App zurückgreifen.

Die zwei grundlegenden Dinge, die Sie tun müssen, sind:

  1. Registrieren Sie Ihre App für den Empfang des kAEGetURL-Ereignisses und legen Sie CFBundleURLTypesin der Info.plist Ihrer App fest, dass httpund enthalten sind https.

  2. Implementieren Sie eine Methode, die das Ereignis kAEGetURL behandelt, und kopieren Sie die URL in die Zwischenablage.

Diese beiden Dinge sind in Objective-C relativ einfach zu tun; Zur Veranschaulichung habe ich eine Beispielanwendung erstellt, die dies ausführt. Sie können es unter https://github.com/houbysoft/short/tree/master/Copy%20URL%20to%20Clipboard anzeigen . Die wichtigste Datei ist https://github.com/houbysoft/short/blob/master/Copy%20URL%20to%20Clipboard/Copy%20URL%20to%20Clipboard/AppDelegate.m . Dort können Sie sehen, wie Sie sich für das registrieren event (dies geschieht in der applicationWillFinishLaunching: -Methode) und wie man es in die Zwischenablage kopiert (dies geschieht in der getUrl: withReplyEvent: -Methode).

Wenn Sie sich faul fühlen und nur sehen möchten, dass dies funktioniert, greifen Sie auf diese Datei zu , extrahieren Sie die Anwendung, legen Sie sie als Standardwebbrowser fest (öffnen Sie die Safari-Einstellungen und suchen Sie diese App im Feld Standardwebbrowser). Klicken Sie dann in Skype auf Ihren Link, und dieser sollte direkt in Ihre Zwischenablage kopiert werden.

houbysoft
quelle
Vielen Dank für Ihre Antwort. Ich wusste nicht, wie URL in OSX verfahren wurde. Ich habe mir Ihren Code angesehen, aber ich kenne Objective-C nicht sehr gut. Aber Ihre resultierende Bewerbung funktioniert wie ein Zauber und das, was ich von Anfang an wollte. Danke noch einmal!
DjDCH
Gute Arbeit an der App (let). Ich würde gerne das Kopfgeld gewähren, aber ich vermisse einige definitive Informationen zu der Frage, ob Automator dazu gezwungen werden kann (oder nicht), ein kAEGetURL-Ereignis zu bestätigen, um dies zu tun.
kopischke
@kopischke: Ich habe gerade in der Automator-Hilfe nach Apple-Ereignissen gesucht und nichts gefunden. Ich denke, es ist fair anzunehmen, dass Automator dies nicht unterstützt.
Houbysoft
Dies ist mit AppleScript möglich. Dies wäre die "logische" Möglichkeit, einen Automator-Workflow zu erweitern, ohne sich mit XCode / ObjC zu befassen und Ihre eigene App zu kompilieren. (Nicht, dass es so kompliziert wäre, aber wahrscheinlich wäre AppleScript einfacher.)
ocodo
Dies scheint am 10.11 nicht zu funktionieren. "/ Programme / URL in Zwischenablage kopieren.app ist nicht als HTTP-Browser verfügbar"
TJ Luoma