2016-09-23 8 views
6

मेरे पास मेरे ऐप में WKWebView है और जब मैं www.google.com या किसी अन्य वेबसाइट को ब्राउज करना शुरू करता हूं जिसके लिए स्थान सेवा की आवश्यकता होती है, तो पॉप अप विंडो दिखाई देती है, डिवाइस के स्थान तक पहुंचने की अनुमति मांगने के बावजूद, अगर मैं पहले से ही मेरे स्थान को साझा करने के लिए स्वीकार किया।WKWebView को बार-बार स्थान तक पहुंचने के लिए अनुमति मांगने के लिए कैसे रोकें?

इस स्थान की सामग्री को प्रबंधित करने के लिए मैंने केवल एक चीज यह है कि मैंने info.plist में NSLocationWhenInUseUsageDescription विशेषता को जोड़ा।

मुझे वेब पर कोई जवाब नहीं मिला, इसलिए किसी भी विचार की वास्तव में सराहना की जाएगी।

उत्तर

3

बाहर निकलना मुश्किल है, लेकिन करना संभव है। आपको जावास्क्रिप्ट कोड इंजेक्ट करना होगा जो navigator.geolocation पर अनुरोधों को रोकता है और उन्हें अपने ऐप में स्थानांतरित करता है, फिर CLLocationManager के साथ स्थान प्राप्त करें, फिर जावास्क्रिप्ट पर वापस स्थान डालें।

  1. अपने WKWebView विन्यास जो navigator.geolocation के तरीकों को ओवरराइड करता है करने के लिए WKUserScript जोड़ें:

    यहाँ संक्षिप्त योजना है। अपने WKWebView को

    WKUserContentController.add(_:name:) साथ
    navigator.geolocation.getCurrentPosition = function(success, error, options) { ... }; 
    navigator.geolocation.watchPosition = function(success, error, options) { ... }; 
    navigator.geolocation.clearWatch = function(id) { ... }; 
    
  2. ऐड स्क्रिप्ट संदेश हैंडलर: इंजेक्शन जावास्क्रिप्ट इस तरह दिखना चाहिए। इंजेक्शन जावास्क्रिप्ट इस तरह, अपने हैंडलर बुलाना चाहिए:

    window.webkit.messageHandlers.locationHandler.postMessage('getCurrentPosition'); 
    
  3. एक वेब पेज एक स्थान का अनुरोध करेंगे जब, इस विधि userContentController(_:didReceive:) सक्रिय होंगे तो अपने एप्लिकेशन को पता होगा कि वेब पेज स्थान अनुरोध कर रहा है। सामान्य रूप से CLLocationManager की सहायता से अपना स्थान खोजें।

  4. अब webView.evaluateJavaScript("didUpdateLocation({coords: {latitude:55.0, longitude:0.0}, timestamp: 1494481126215.0})") के साथ अनुरोध करने वाले जावास्क्रिप्ट पर स्थान को इंजेक्ट करने का समय है। बेशक आपके इंजेक्शन वाले जावास्क्रिप्ट में didUpdateLocation फ़ंक्शन सफलतापूर्वक प्रबंधित हैनर को लॉन्च करने के लिए तैयार होना चाहिए।

काफी लंबा एल्गोरिदम, लेकिन यह काम करता है!

संबंधित मुद्दे