WKWebView WKScriptMessageHandler未使用iOS 10,XCode 8 beta调用

NYS*_*NYS 10 wkwebview swift3 xcode8

我需要将我的代码更新为swift 3.下面的代码是完美的原始解决方案,但是在XCode 8 beta和iOS 10中使用swift 3时,'userContentController'委托在我使用原始的html + js代码时没有调用打电话给本机.

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

    }
Run Code Online (Sandbox Code Playgroud)

guo*_*zzu 5

经过调试很多时间和条件,我发现:

  1. postMessage()JS中的函数必须具有一个参数,该参数永远不能为null

  2. 参数必须是JSON类型

  3. 例如 : webkit.messageHandlers.refreshWebPage.postMessage("status":"ok");

如果您已遵循上述三个建议,并设置了正确的代表。委托函数didReceiveScriptMessage将被调用。希望这对您有所帮助。

  • 为了澄清起见,没有委派任何代表。func userContentController(WKUserContentController,didReceive:WKScriptMessage)是来自WKScriptMessageHandler协议的方法,系统会调用该方法。 (3认同)

Ein*_*eln 4

你找到解决方法了吗?因为我也有问题,但幸运的是,我可以发送消息,并且 userContentController 确实回调了,但消息只能是数字,没有字符串,没有字符。我不知道为什么...

编辑 我已经找到了关于这个的答案。看来你必须放入 try catch,在我这样做之后,它 100% 可以处理文本数字甚至 json

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

并且不要忘记callbackHandler在 iOS 中必须是相同的单词才能使其工作,您不必命名回调处理程序,您可以将其命名为任何名称,但它在 Javascript 和 iOS 中必须相同

希望对您有帮助