2016-09-08 26 views
6

Tôi cần cập nhật mã của mình lên nhanh chóng 3. Mã bên dưới là giải pháp ban đầu hoạt động hoàn hảo, nhưng trong XCode 8 beta và iOS 10 với nhanh 3 'userContentController 'đại biểu không được gọi khi tôi sử dụng mã html + js gốc để gọi bên gốc.WKWebView WKScriptMessageHandler không được gọi với iOS 10, XCode 8 beta

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

tôi cũng vậy, không tìm thấy giải pháp nào ... HELP! – Quadrivium

Trả lời

1

Bạn có tìm cách khắc phục không? bởi vì tôi có một vấn đề cũng nhưng May mắn thay, tôi có thể gửi tin nhắn và userContentController đã gọi lại nhưng chỉ tin nhắn có được trong số chỉ, không có chuỗi, không có ký tự. Tôi không biết tại sao ...

Đã chỉnh sửa Tôi đã tìm ra câu trả lời về điều này. Nó dường như rằng bạn cần phải đặt trong cố gắng nắm bắt và sau khi tôi đã làm điều đó đó là 100% làm việc với số lượng văn bản hoặc thậm chí json

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

Và Đừng quên rằng callbackHandler phải là cùng một từ trong iOS để làm cho nó hoạt động, bạn không cần phải đặt tên CallbackHandler, bạn có thể đặt tên cho nó bất cứ điều gì nhưng nó phải là như nhau trong cả hai javascript và iOS

Hy vọng nó giúp bạn

+0

Tôi cũng gặp vấn đề với WKScriptMessageHandler không được gọi trên iOS 10. Tôi đã đăng sự cố lên Diễn đàn nhà phát triển Apple: https://forums.developer.apple.com/message/180962 –

2

tôi cố định này bằng cách chỉ có một contentController như

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

Sau đó, trong hàm userContentController, tôi phân tích cú pháp nội dung để xác định hành động được yêu cầu và các tham số khác. Nếu tôi gửi {hành động: "doThis", params: [1,2,3]}, mã phân tích của tôi sẽ như thế nào:

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

Đó là xảy ra bởi vì về cơ bản window.webkit.messageHandlers là một loại UserMessageHandlersNamespace.

Bạn nên cố gắng để vượt qua một cuốn từ điển thay vì một chuỗi hoặc một mảng:

Javascript phần:

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

Swift phần:

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)") 
      } 
     } 
} 

T.B. (Điều này hoạt động trên cả iOS9, iOS10 theo với các xét nghiệm của tôi)

4

Afer tôi gỡ lỗi rất nhiều lần và điều kiện, tôi thấy rằng:

  1. Chức năng postMessage() trong JS của bạn phải có một tham số, các tham số không bao giờ được null

  2. các tham số phải JSON loại

  3. Ví dụ: webkit.messageHandlers.refreshWebPage.postMessage("status":"ok");

Nếu bạn đã làm theo ba lời khuyên trên và đã thiết lập các đại biểu chính xác. Chức năng ủy nhiệm didReceiveScriptMessage sẽ được gọi. Hy vọng điều này sẽ giúp bạn.

Các vấn đề liên quan