2016-09-08 20 views
6

के साथ कॉल नहीं किया गया है। मुझे अपने कोड को तेज़ करने के लिए अपडेट करना होगा 3. नीचे दिया गया कोड मूल समाधान है जो पूरी तरह से काम करता है, लेकिन एक्सकोड 8 बीटा और आईओएस 10 में स्विफ्ट 3 के साथ 'userContentController जब मैं देशी पक्ष को कॉल करने के लिए मूल एचटीएमएल + जेएस कोड का उपयोग करता हूं तो प्रतिनिधि को नहीं कहा जाता है।WKWebView WKScriptMessageHandler को आईओएस 10, एक्सकोड 8 बीटा

class ViewController: UIViewController, WKUIDelegate, WKScriptMessageHandler, WKNavigationDelegate,UIWebViewDelegate,CLLocationManagerDelegate,URLSessionDataDelegate,UIImagePickerControllerDelegate, UINavigationControllerDelegate { 

.... 

func initWebView(){ 
    // JAVASCRIPT PART 
    let contentController = WKUserContentController(); 

    let jScript:String = "var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);"; 

    let wkUScript:WKUserScript = WKUserScript(source: jScript, injectionTime: WKUserScriptInjectionTime.atDocumentEnd, forMainFrameOnly: true); 


    contentController.addUserScript(wkUScript) 
    contentController.add(
     self, 
     name: "refreshWebPage" 
    ) 
    contentController.add(
     self, 
     name: "forceStepBack" 
    ) 
    contentController.add(
     self, 
     name: "setPageTitle" 
    ) 
    contentController.add(
     self, 
     name: "allowBackNavigate" 
    ) 
    contentController.add(
     self, 
     name: "changeBackNavigationURL" 
    ) 

    contentController.add(
     self, 
     name: "changeLeftButtonIconVisibility" 
    ) 
    contentController.add(
     self, 
     name: "changeRightButtonIconVisibility" 
    ) 
    contentController.add(
     self, 
     name: "clearWebCache" 
    ) 
    contentController.add(
     self, 
     name: "changeMobileAndPassword" 
    ) 


    let config = WKWebViewConfiguration() 
    config.userContentController = contentController 


    self.webView = WKWebView(frame: CGRect.zero, configuration: config) 


    self.view.translatesAutoresizingMaskIntoConstraints = false 
    self.webView!.navigationDelegate = self 
    self.webView!.uiDelegate = self; 
    self.webView!.scrollView.bounces = false; 
    view = webView 

    webView?.loadHTMLString(self.baseURL!, baseURL: nil) 

} 
... 
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { 
     print("JavaScript is sending a message: \(message.body)") 
     print("JavaScript is sending a message.name: \(message.name)") 

    } 
+0

मुझे भी, कोई समाधान नहीं ढूंढ रहा है ... मदद! – Quadrivium

उत्तर

1

क्या आपको इसे ठीक करने का तरीका मिल गया है? क्योंकि मुझे भी एक समस्या है लेकिन सौभाग्य से, मैं संदेश भेज सकता हूं और उपयोगकर्ता सामग्री नियंत्रक वापस बुलाया गया था, लेकिन केवल संदेश केवल संख्या में होना चाहिए, कोई स्ट्रिंग नहीं, कोई वर्ण नहीं है। मुझे नहीं पता क्यों ...

संपादित मुझे इसके बारे में जवाब मिल गया है। यह प्रतीत आप कोशिश पकड़ में डाल करने के लिए है कि और के बाद मैंने किया है कि यह 100% पाठ संख्या या यहाँ तक कि json के साथ काम कर रहा है

`<script> 
    function callNative(message) { 
    try { 
     webkit.messageHandlers.callbackHandler.postMessage(message) 
    } catch(err) { 
     console.log("Error") 
    } 
    } 
</script>` 

और यह न भूलें कि callbackHandler लिए आईओएस में एक ही शब्द हो गया है यह काम, आप callbackHandler नाम के लिए नहीं है, आप इसे कुछ भी नाम दे सकते हैं, लेकिन यह दोनों जावास्क्रिप्ट और आईओएस में एक ही

आशा है कि यह आप

+0

मुझे WKScriptMessageHandler के साथ समस्याएं भी आईओएस 10 पर नहीं बुलाई जा रही हैं। मैंने ऐप्पल डेवलपर फ़ोरम पर समस्या पोस्ट की: https://forums.developer.apple.com/message/180962 –

2

में मदद करता है मैं केवल एक contentController होने से इस तय हो गया है जैसे

let contentController = WKUserContentController() 
contentController.add(self, name: "MyStuff") 

फिर उपयोगकर्ता में कंटेंट कंट्रोलर फ़ंक्शन मैं अनुरोधित कार्रवाई और अन्य पैरामीटर निर्धारित करने के लिए शरीर को पार्स करता हूं। अगर मैं भेजें {: "doThis", पैरामीटर: कार्रवाई [1,2,3]}, मेरे पार्स कोड की तरह होगा:

if message.name == "MyStuff" { 
    let cmd:NSDictionary = message.body as! NSDictionary 
    let action:String = cmd["action"] as! String 
    switch action { 
    case "doThis": 
     // Do my stuff 
     break 
    default: 
     break 
    } 
} 
0

क्योंकि मूल रूप से window.webkit.messageHandlers एक UserMessageHandlersNamespace प्रकार है हुआ है।

आप एक स्ट्रिंग या एक सरणी के बजाय एक शब्दकोश पारित करने के लिए प्रयास करना चाहिए:

JavaScript हिस्से:

var dictionary = {"key1":"value1", "key2":"value2", "subDictionary": {"name": "foo"}} 
webkit.messageHandlers.refreshWebPage.postMessage(dictionary); 

स्विफ्ट हिस्सा:

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { 
     let body = message.body 
     if let dict = body as? Dictionary<String, AnyObject> { 
      if let test = dict["key1"] { 
       print("JavaScript is sending a message \(value1)") 
      } 
     } 
} 

पी.एस. (यह दोनों iOS9 पर काम करता है, iOS10 मेरी परीक्षणों के साथ अनुसार)

4

Afer मैं कई बार और शर्तों का एक बहुत डिबग, मैंने पाया कि:

  1. समारोह postMessage() अपने जे एस में एक होना आवश्यक है पैरामीटर, पैरामीटर अशक्त कभी नहीं हो

  2. पैरामीटरहोना चाहिए 210 प्रकार

  3. उदाहरण के लिए: webkit.messageHandlers.refreshWebPage.postMessage("status":"ok");

आप ऊपर तीन सलाह का पालन किया है और प्रतिनिधि सही सेट किया है। प्रतिनिधि समारोह didReceiveScriptMessage कहा जाएगा। उम्मीद है कि यह आपकी मदद करेगा।

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