Ich habe einen benutzerdefinierten URL-Protokollhandler erstellt.
http://
mailto://
custom://
Ich habe eine WinForms-Anwendung registriert, um entsprechend zu antworten. Das alles funktioniert super.
Ich möchte jedoch in der Lage sein, den Fall, in dem der Benutzer den benutzerdefinierten URL-Protokollhandler noch nicht installiert hat, ordnungsgemäß zu behandeln.
Um dies tun zu können, muss ich in der Lage sein, die registrierten Protokollhandler des Browsers zu erkennen, würde ich von JavaScript annehmen. Aber ich konnte keinen Weg finden, um nach Informationen zu suchen. Ich hoffe, eine Lösung für dieses Problem zu finden.
Vielen Dank für alle Ideen, die Sie teilen können.
javascript
browser
protocols
moniker
Chris Craft
quelle
quelle
Antworten:
Dies wäre ein sehr , sehr hackiger Weg, dies zu tun ... aber würde das funktionieren?
Weit davon entfernt, kugelsicher zu sein ... aber es könnte helfen?
quelle
Es gibt keine großartige browserübergreifende Möglichkeit, dies zu tun. In IE10 + unter Win8 +
msLaunchUri
können Sie mit einer neuen API ein Protokoll wie folgt starten:Wenn das Protokoll nicht installiert ist, wird der Fehlerrückruf ausgelöst. Andernfalls wird das Protokoll gestartet und der erfolgreiche Rückruf wird ausgelöst.
Ich diskutiere dieses Thema hier etwas weiter: http://blogs.msdn.com/b/ieinternals/archive/2011/07/14/url-protocols-application-protocols-and-asynchronous-pluggable-protocols-oh-my .aspx
quelle
HTML5 definiert benutzerdefinierte Schema- und Inhaltshandler (meines Wissens ist Firefox der einzige Implementierer bis jetzt), aber leider gibt es derzeit keine Möglichkeit zu überprüfen, ob bereits ein Handler vorhanden ist - es wurde vorgeschlagen , aber es gab keine Folgemaßnahmen. Dies scheint eine wichtige Funktion zu sein, um benutzerdefinierte Handler effektiv zu verwenden, und wir als Entwickler sollten auf dieses Problem aufmerksam machen, um es zu implementieren.
quelle
Es scheint keine einfache Möglichkeit zu geben, über Javascript das Vorhandensein einer installierten App zu erkennen, die einen Protokollhandler registriert hat.
Im iTunes-Modell stellt Apple seinen Servern URLs zur Verfügung, die dann Seiten bereitstellen, auf denen Javascript ausgeführt wird:
http://ax.itunes.apple.com/detection/itmsCheck.js
Das iTunes-Installationsprogramm stellt also anscheinend Plugins für die wichtigsten Browser bereit, deren Vorhandensein dann erkannt werden kann.
Wenn Ihr Plugin installiert ist, können Sie ziemlich sicher sein, dass die Umleitung zu Ihrer app-spezifischen URL erfolgreich ist.
quelle
Die einfachste Lösung besteht darin, den Benutzer zum ersten Mal zu fragen.
Verwenden eines Javascript-Bestätigungsdialogs pro Beispiel:
quelle
Wenn Sie die Kontrolle über das Programm haben, das Sie ausführen möchten (den Code), können Sie feststellen, ob der Benutzer die Anwendung erfolgreich ausgeführt hat:
Bevor Sie versuchen, das benutzerdefinierte Protokoll zu öffnen, stellen Sie eine AJAX-Anforderung an ein Serverskript, das die Absicht des Benutzers in einer Datenbank speichert (speichern Sie beispielsweise die Benutzer-ID und die gewünschten Aktionen).
Versuchen Sie, das Programm zu öffnen und die Absichtsdaten weiterzugeben.
Lassen Sie das Programm den Server auffordern, den Datenbankeintrag zu entfernen (verwenden Sie die Absichtsdaten, um die richtige Zeile zu finden).
Lassen Sie das Javascript eine Weile auf dem Server abfragen, um festzustellen, ob der Datenbankeintrag nicht mehr vorhanden ist. Wenn der Eintrag nicht mehr vorhanden ist, wissen Sie, dass der Benutzer die Anwendung erfolgreich geöffnet hat. Andernfalls bleibt der Eintrag erhalten (Sie können ihn später mit cronjob entfernen).
Ich habe diese Methode nicht ausprobiert, sondern nur gedacht.
quelle
Mit einer Kombination aus dieser und einer supereinfachen Safari-Erweiterung konnte ich endlich eine browserübergreifende Lösung (Chrome 32, Firefox 27, IE 11, Safari 6) erhalten . Ein Großteil dieser Lösung wurde auf die eine oder andere Weise in dieser und dieser anderen Frage erwähnt .
Hier ist das Skript:
Die Safari-Erweiterung war einfach zu implementieren. Es bestand aus einer einzelnen Zeile des Injektionsskripts:
myinject.js:
Dann müssen Sie auf der Webseite JavaScript zuerst das Nachrichtenereignis registrieren und ein Flag setzen, wenn die Nachricht empfangen wird:
Dies setzt voraus, dass die Anwendung, die dem benutzerdefinierten Protokoll zugeordnet ist, die Installation der Safari-Erweiterung verwaltet.
Wenn der Rückruf false zurückgibt, müssen Sie den Benutzer in allen Fällen darüber informieren, dass die Anwendung (dh das benutzerdefinierte Protokoll) nicht installiert ist.
quelle
myWindow.location.href;
und iframesrc
in diesem Fenster definiert? Soll es eine Ausnahme auslösen? Dies gilt unabhängig davon, ob das benutzerdefinierte Protokoll unterstützt wird oder nicht.Sie sagen, Sie müssen die Protokollhandler des Browsers erkennen - wirklich?
Was ist, wenn Sie so etwas wie das getan haben, was passiert, wenn Sie eine Datei von sourceforge herunterladen? Angenommen, Sie möchten myapp: // etwas öffnen. Anstatt einfach einen Link zu erstellen, erstellen Sie einen Link zu einer anderen HTML-Seite, auf die über HTTP zugegriffen wird. Sagen Sie dann auf dieser Seite, dass Sie versuchen, die Anwendung für sie zu öffnen. Wenn es nicht funktioniert, müssen sie Ihre Anwendung installieren. Klicken Sie dazu auf den von Ihnen angegebenen Link. Wenn es funktioniert, sind Sie fertig.
quelle
Sie können so etwas ausprobieren:
quelle
Ich versuche etwas Ähnliches zu tun und habe gerade einen Trick entdeckt, der mit Firefox funktioniert. Wenn Sie es mit dem Trick für IE kombinieren, können Sie einen haben, der auf beiden Hauptbrowsern funktioniert (ich bin nicht sicher, ob es in Safari funktioniert und ich weiß, dass es in Chrome nicht funktioniert).
Damit dies funktioniert, müssen Sie außerdem irgendwo auf der Seite einen versteckten Link haben, wie folgt:
Es ist ein bisschen hacky, aber es funktioniert. In der Firefox-Version wird leider immer noch die Standardwarnung angezeigt, die angezeigt wird, wenn Sie versuchen, einen Link mit einem unbekannten Protokoll zu besuchen. Ihr Code wird jedoch ausgeführt, nachdem die Warnung verworfen wurde.
quelle
Dies war ein vom Microsoft-Support empfohlener Ansatz für IE
http://msdn.microsoft.com/en-us/library/ms537503%28VS.85%29.aspx#related_topics
"Wenn Sie die Kontrolle über die auf dem Computer eines Benutzers installierten Binärdateien haben, scheint das Überprüfen der UA im Skript ein relevanter Ansatz zu sein: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ Aktuelle Version \ Interneteinstellungen \ 5.0 \ User Agent \ Post Platform" - Durch M $ Unterstützung
Jede Webseite hat Zugriff auf die Zeichenfolge userAgent. Wenn Sie einen benutzerdefinierten Wert für die Post-Plattform löschen, ist es recht einfach, diesen Wert mithilfe von navigator.userAgent in Javascript zu erkennen.
Glücklicherweise werfen andere gängige Browser wie Firefox und Chrome (mit Ausnahme von Safari :() keine Fehler "Seite nicht gefunden" aus, wenn auf einen Link mit einem benutzerdefinierten Protokoll geklickt wird und das Protokoll nicht auf dem Computer des Benutzers installiert ist. Der IE ist hier sehr unversöhnlich Jeder Trick, in einen unsichtbaren Frame zu klicken oder Javascript-Fehler abzufangen, funktioniert nicht und führt zu einem hässlichen Fehler "Webseite kann nicht angezeigt werden". Der Trick, den wir in unserem Fall verwenden, besteht darin, Benutzer mit browserspezifischen Bildern darüber zu informieren, dass sie auf das benutzerdefinierte Protokoll klicken Der Link öffnet eine Anwendung. Wenn die App nicht geöffnet wird, können sie auf eine "Installations" -Seite klicken. In Bezug auf XD ist dies weitaus besser als der ActiveX-Ansatz für IE. Für FF und Chrome fahren Sie einfach fort und starten Sie das benutzerdefinierte Protokoll ohne Erkennung. Lassen Sie sich vom Benutzer mitteilen, was er sieht. Für Safari:(noch keine Antworten
quelle
Dies ist keine triviale Aufgabe; Eine Option könnte darin bestehen, signierten Code zu verwenden, mit dem Sie auf die Registrierung und / oder das Dateisystem zugreifen können (bitte beachten Sie, dass dies eine sehr teure Option ist). Es gibt auch keine einheitliche API oder Spezifikation für die Codesignatur, sodass Sie für jeden Zielbrowser spezifischen Code generieren müssen. Ein unterstützender Albtraum.
Ich weiß auch, dass Steam , das System zur Bereitstellung von Spielinhalten, dieses Problem anscheinend auch nicht gelöst hat.
quelle
Hier ist eine weitere hackige Antwort, die eine (hoffentlich leichte) Änderung Ihrer Anwendung erfordern würde, um beim Start nach Hause zu telefonieren.
quelle