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

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

Ich habe über Lösungen nachgedacht, aber ich bin derzeit nicht in der Lage, eine zu implementieren. Wenn ich eine Anwendung erstellen kann, die URLs in die Zwischenablage einfügt, die an sie gesendet werden, und diese Anwendung als Standard-Webbrowser festlegen kann, wäre ich in der Lage, mein Ziel zu erreichen.

Ich habe mit Automator eine Anwendung erstellt, die den Shell-Befehl ausführt, pbcopyund diese Anwendung als meinen 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. Ich kann jedoch die URL nicht an das Anwendungs- / Shell-Skript übergeben. Ich habe sowohl stdin als auch ein übergebenes Argument ausprobiert, aber ohne Erfolg.

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

Gibt es alternativ eine bessere Möglichkeit, einen gefälschten Webbrowser zu erstellen, der die Eingabe übernimmt und in die Zwischenablage legt, als Automator? Oder gibt es eine andere Möglichkeit, wie ich mein Ziel ohne eine benutzerdefinierte Anwendung / ein benutzerdefiniertes Skript erreichen kann?

Ich stelle dies nicht als Antwort dar, da es keine vollständige Lösung ist, aber es ist 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 bekomme einfach keine Texteingabe in eine Automator-App.
Dito, aber ich habe Choosy verwendet. Ich habe ziemlich viele Tests durchgeführt und folgendes herausgefunden: 1) Die Automator-App läuft. 2) Es scheint überhaupt keine Eingabe zu erhalten. 3) Ergo, wenn einem Browser ein "Link" gesendet wird, wird ihm keine URL im Klartext gesendet. Das muss anders gehandhabt werden, und darum geht es eigentlich.

Antworten (2)

Die Art und Weise, wie URLs in Mac OS X geöffnet werden, ist tatsächlich 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, das die URL enthält.

Ich habe Automator nie wirklich verwendet (es ist einfach viel zu langsam und begrenzt für meine typische Verwendung), 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 CFBundleURLTypesSie in der Info.plist Ihrer App fest, dass sie httpund einschließt https.

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

Diese beiden Dinge sind in Objective-C relativ unkompliziert; Zur Veranschaulichung habe ich eine Beispielanwendung erstellt, die dies tut. 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 die registrieren event (dies geschieht in der Methode applicationWillFinishLaunching:) und wie es in die Zwischenablage kopiert wird (dies geschieht in der Methode getUrl:withReplyEvent:).

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

Vielen Dank für Ihre Antwort. Ich wusste nicht, wie die URL in OSX vorgeht. Ich habe mir Ihren Code angesehen, aber ich kenne Objective-C nicht sehr gut. Aber Ihre resultierende Anwendung funktioniert wie ein Zauber und das, was ich von Anfang an wollte. Danke noch einmal!
Gute Arbeit an der App(let). Ich würde das Kopfgeld gerne vergeben, aber mir fehlen 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: Ich habe gerade die Automator-Hilfe nach einer Erwähnung von Apple-Ereignissen durchsucht, und es wurde nichts gefunden. Ich denke, es ist fair anzunehmen, dass Automator dies nicht unterstützt.
Dies ist mit AppleScript möglich, was der "logische" Weg wäre, einen Automator-Workflow zu erweitern, ohne in XCode / ObjC einzutauchen und eine eigene App zu kompilieren. (Nicht, dass es so kompliziert wäre, aber es ist wahrscheinlich, dass AppleScript einfacher wäre.)
Am 10.11 scheint das nicht zu funktionieren. „/Applications/Copy URL to Clipboard.app ist nicht als HTTP-Browser verfügbar“

Schritt 1: Open Source installieren und aktiv pflegen https://github.com/johnste/finicky . Finicky ist eine Anwendung, mit der Sie Links basierend auf von Ihnen festgelegten Regeln an verschiedene Browser weiterleiten können. Damit dies funktioniert, sollte Finicky Ihr Standardbrowser sein.

Schritt 2: Öffnen Sie den Skripteditor, fügen Sie den folgenden Code ein und speichern Sie ihn als Anwendung. Nennen wir diese eine UrlHandler.app:

on open location input
    set the clipboard to input
end open location

Schritt 3: Geben Sie an, an welchen Browser Finicky standardmäßig Links senden soll. Ändern Sie in ~/.finicky.js in Schritt 2 den defaultBrowser auf die UrlHandler.app.

module.exports = {
  defaultBrowser: "com.apple.ScriptEditor.id.UrlHandler",
  ...

Hier ist eine alternative Konfiguration, die Links nur dann an UrlHandler.app sendet, wenn Sie bei gedrückter Befehlstaste auf einen Link klicken:

module.exports = {
  defaultBrowser: "Firefox",
  handlers: [
    {
      match: ({ keys }) => keys.command,
      browser: "com.apple.ScriptEditor.id.UrlHandler"
    }
  ]
};