93 votes

Comment détecter les gestionnaires de protocole du navigateur ?

J'ai créé un gestionnaire de protocole URL personnalisé.

http://

mailto://

custom://

J'ai enregistré une application WinForms pour répondre en conséquence. Tout cela fonctionne parfaitement.

Mais j'aimerais pouvoir traiter de manière élégante le cas où l'utilisateur n'a pas encore installé le gestionnaire de protocole URL personnalisé.

Pour ce faire, je dois être en mesure de détecter les gestionnaires de protocole enregistrés par le navigateur, à partir de JavaScript, je suppose. Mais je n'ai pas réussi à trouver un moyen d'obtenir cette information. J'espère trouver une solution à ce problème.

Merci pour toutes les idées que vous pourriez partager.

5 votes

Je pense que cela ne serait possible que dans le code chrome (c'est-à-dire XPCOM, ActiveX, etc.). Sinon, ce serait un problème de confidentialité ("Nous avons détecté que vous utilisez Eudora, passez à FooMail aujourd'hui !"). Mais veuillez préciser quel(s) navigateur(s)/OS vous intéresse(nt).

1 votes

Bon point, mais je serais heureux de savoir que quelque chose est enregistré pour gérer mon protocole propriétaire acsfs:// Windows IE, FireFox et, idéalement, Safari.

0 votes

Avez-vous déjà résolu ce problème ?

40voto

scunliffe Points 30964

Il s'agirait d'un très , très hacky moyen de le faire... mais est-ce que ça marcherait ?

  • Mettez le lien comme d'habitude...
  • Mais attachez-y un gestionnaire de clic, qui déclenche une minuterie et ajoute un gestionnaire d'effacement pour la fenêtre.
  • (en théorie) si le navigateur gère le lien (l'application X) se chargera en volant le focus de la fenêtre...
  • Si l'événement onblur se déclenche, effacez le timer...
  • Sinon, dans 3-5 secondes, laissez votre délai d'attente se déclencher... et informez l'utilisateur "Hmm, on dirait que l'application Mega Uber Cool n'est pas installée... voulez-vous l'installer maintenant ? (Ok) (Annuler)"

Loin d'être à l'épreuve des balles... mais ça pourrait aider ?

1 votes

:D C'est une idée intelligente. Il semble qu'il y aurait un moyen de le faire parce que cela semble être un besoin commun.

2 votes

Dans Firefox sur Mac (peut-être plus de navigateurs), la fenêtre perd le focus et onblur se déclenche même si l'application avec le protocole personnalisé ne se lance pas.

0 votes

Il s'agit d'une solution décente pour Chrome, puisqu'il ne dispose d'aucun type de gestion des erreurs pour les protocoles. Cette solution a été utilisée en conjonction avec la détection d'autres navigateurs ici : rajeshsegu.com/2012/09/browser-detect-custom-protocols/

20voto

Hugh Guiney Points 368

HTML5 définit Gestionnaires de schéma et de contenu personnalisés (à ma connaissance, Firefox est le seul metteur en œuvre jusqu'à présent), mais malheureusement il n'y a actuellement aucun moyen de vérifier si un gestionnaire existe déjà - il a été proposée mais il n'y a pas eu de suivi. Il s'agit d'une fonctionnalité essentielle pour utiliser efficacement les gestionnaires personnalisés. En tant que développeurs, nous devrions attirer l'attention sur cette question afin de la faire implémenter.

19voto

EricLaw Points 28850

Il n'y a pas de moyen efficace de faire cela en fonction des navigateurs. Dans IE10+ sur Win8+, un nouveau bouton msLaunchUri api vous permet de lancer un protocole, comme ceci :

navigator.msLaunchUri('skype:123456', 
  function() 
  { 
    alert('success');
  }, 
  function()
  {
    alert('failed');
  } 
); 

Si le protocole n'est pas installé, le rappel d'échec se déclenchera. Sinon, le protocole sera lancé et le rappel de réussite sera déclenché.

Je discute de ce sujet un peu plus loin ici : https://web.archive.org/web/20180308105244/https://blogs.msdn.microsoft.com/ieinternals/2011/07/13/understanding-protocols/

Ce sujet a suscité un intérêt récent (2021) ; voir https://github.com/fingerprintjs/external-protocol-flooding pour la discussion.

0 votes

IL NE FONCTIONNE PAS - testé sous Windows 7, navigateurs IE

7 votes

MsLaunchUri est réservé à Windows 8+.

0 votes

Le lien était mort.

13voto

jtomson Points 156

Il semble qu'il n'existe pas de moyen direct, via javascript, de détecter la présence d'une application installée qui a enregistré un gestionnaire de protocole.

Dans le modèle iTunes, Apple fournit des urls vers ses serveurs, qui fournissent ensuite des pages qui exécutent du javascript :

http://ax.itunes.apple.com/detection/itmsCheck.js

Ainsi, le programme d'installation d'iTunes déploie apparemment des plugins pour les principaux navigateurs, dont la présence peut ensuite être détectée.

Si votre plugin est installé, vous pouvez être raisonnablement sûr que la redirection vers l'url spécifique à votre application sera réussie.

2 votes

Cela devrait être la solution la plus fiable. Mais cela signifie que vous devez installer et créer un plugin pour la plupart des navigateurs, ce qui est assez délicat. Il serait plus convivial de pouvoir rediriger l'utilisateur vers la page de téléchargement à la place.

0 votes

Pourquoi ne pas utiliser FireBreath comme mentionné ici ? stackoverflow.com/a/14758085/427793

11voto

Natim Points 4393

La solution la plus simple semble être de demander à l'utilisateur la première fois.

En utilisant un dialogue de confirmation en Javascript par exemple :

You need this software to be able to read this link. Did you install it ?

if yes: create a cookie to not ask next time; return false and the link applies
if false: window.location.href = '/downloadpage/'

2 votes

Les cookies peuvent être supprimés quotidiennement. Il n'y a pas de meilleur moyen de créer un cookie basé sur Flash ?

0 votes

Si le cookie est supprimé, l'utilisateur sera simplement invité à nouveau.

0 votes

Je pense que vscode utilise cette méthode, vérifiez leur site. marché.visualstudio.com

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X