2016-09-23 65 views
6

Uygulamamda bir WKWebView var ve www.google.com adresine veya konum hizmeti gerektiren başka bir web sitesine göz atmaya başladığımda, önceden açılmış olsa bile aygıtın konumuna erişmek için izin istediğimde bir açılır pencere belirir konumumu paylaşmayı kabul etti.WKWebView, tekrar tekrar konum erişim izni istemek nasıl engellenir?

Bu konum bilgisini yönetmek için yaptığım tek şey, özniteliğimi info.plist ekledim.

Web'de herhangi bir yanıt bulamadım, bu yüzden herhangi bir fikir gerçekten takdir edilecektir.

cevap

3

Bunu yapmak oldukça zor, ancak yapılması mümkündür. navigator.geolocation numaralı telefona gelen istekleri engelleyen ve bunları uygulamanıza aktaran JavaScript kodunu enjekte etmeniz, ardından CLLocationManager ile konumu almanız ve ardından JavaScript'in yerini geri enjekte etmeniz gerekmektedir.

  1. navigator.geolocation yöntemlerini geçersiz kılar sizin WKWebView yapılandırmasına WKUserScript ekleyin:

    İşte kısa düzenidir. Enjekte JavaScript gibi görünmelidir:

    navigator.geolocation.getCurrentPosition = function(success, error, options) { ... }; 
    navigator.geolocation.watchPosition = function(success, error, options) { ... }; 
    navigator.geolocation.clearWatch = function(id) { ... }; 
    
  2. WKUserContentController.add(_:name:) ile eklenti komut mesajı işleyicisi sizin WKWebView için. Enjekte JavaScript gibi, işleyici çağırmalıdır: Bir web sayfası bir konum talep edecek, bu yöntem bu nedenle uygulama web sayfası yerini istiyor bilemez userContentController(_:didReceive:) ateş edeceği

    window.webkit.messageHandlers.locationHandler.postMessage('getCurrentPosition'); 
    
  3. . Her zamanki gibi CLLocationManager yardımıyla konumunuzu bulun.

  4. Artık konumun istekte bulunan JavaScript'e webView.evaluateJavaScript("didUpdateLocation({coords: {latitude:55.0, longitude:0.0}, timestamp: 1494481126215.0})") ile enjekte edilmesi zamanı geldi. Elbette, enjekte edilen JavaScript'iniz, kayıtlı başarı handalını başlatmak için hazır olan didUpdateLocation işlevine sahip olmalıdır.

Uzun bir algoritma var ama işe yarıyor!