9 votes

Comment empêcher WKWebView de demander à plusieurs reprises la permission d'accéder à l'emplacement ?

J'ai un WKWebView dans mon application et lorsque je commence à naviguer sur www.google.com ou tout autre site web qui nécessite un service de localisation, une fenêtre pop up apparaît, demandant la permission d'accéder à la localisation de l'appareil même si j'ai déjà accepté de partager ma localisation.

La seule chose que j'ai faite pour gérer ces questions de localisation est d'ajouter la fonction NSLocationWhenInUseUsageDescription dans mon info.plist .

Je n'ai trouvé aucune réponse sur le web, donc toute idée serait très appréciée.

7voto

Alexander Vasenin Points 399

Il s'avère que c'est assez difficile, mais possible. Vous devez injecter du code JavaScript qui intercepte les requêtes adressées à navigator.geolocation et les transférer dans votre application, puis obtenir la localisation avec CLLocationManager puis réinjecter l'emplacement dans le JavaScript.

En voici le schéma succinct :

  1. Ajouter WKUserScript à votre WKWebView qui remplace les méthodes de navigator.geolocation . Le JavaScript injecté devrait ressembler à ceci :

    navigator.geolocation.getCurrentPosition = function(success, error, options) { ... };
    navigator.geolocation.watchPosition = function(success, error, options) { ... };
    navigator.geolocation.clearWatch = function(id) { ... };
  2. Avec WKUserContentController.add(_:name:) ajouter le gestionnaire de messages script à votre WKWebView . Le JavaScript injecté doit appeler votre gestionnaire, comme ceci :

    window.webkit.messageHandlers.locationHandler.postMessage('getCurrentPosition');
  3. Lorsqu'une page web demande une localisation, cette méthode est activée. userContentController(_:didReceive:) pour que votre application sache que la page web demande la localisation. Trouvez votre position à l'aide de CLLocationManager comme d'habitude.

  4. Il est maintenant temps de réinjecter l'emplacement au JavaScript demandeur avec webView.evaluateJavaScript("didUpdateLocation({coords: {latitude:55.0, longitude:0.0}, timestamp: 1494481126215.0})") . Bien entendu, votre JavaScript injecté doit avoir didUpdateLocation prête à être lancée, a enregistré un succès hanlder.

Un algorithme assez long, mais qui fonctionne !

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