美文网首页iOS开发部落iOS Developer程序员
使用WebKit进行js与native交互

使用WebKit进行js与native交互

作者: Qiuny | 来源:发表于2016-10-12 22:03 被阅读1900次

    iOS8.0以后苹果推出了新框架WebKit,用于在app内加载网页时取代UIWebView。WebKit与UIWebView相比,占用内存更少,加载更快,支持更多html5的特性,并且有60fps的滚动刷新率和内置手势。本文用简单的例子介绍使用WebKit本地调用js代码及js调用本地方法。

    文中例子说明

    • 一个简单的网页


      01.png
    • 在文本输入框中输入内容,点击网页中的按键,将信息传到本地并调用本地方法,弹出警告框


      02.png
    • 点击OK后调用js代码将警告框中的内容显示到网页中


      03.png

    例子中用到的js代码在这里

    go on

    初始化WKWebView

    let wkConfig = WKWebViewConfiguration()
    //注意这里的`���������model`
    wkConfig.userContentController.add(self, name: "model")
    wkView = WKWebView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height), configuration: wkConfig)
    let htmlStr = try?String(contentsOfFile: Bundle.main.path(forResource: "demo", ofType: "html")!)
    wkView.loadHTMLString(htmlStr!, baseURL: nil)
    let request = URLRequest(url: URL.init(string: "http://7xlyw8.com1.z0.glb.clouddn.com/demo.html")!)
        wkView.load(request)
    self.view.addSubview(wkView)
    

    注意代码里的model,这里是向WebKit注册js调用的方法

    js向本地发送消息

    window.webkit.messageHandlers.model.postMessage(massage);
    

    代码中的model是在app中使用WKWebViewConfiguration类中的方法注册

    实现WKScriptMessageHandler代理方法

    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        let dic = message.body as! NSDictionary
        showAlert(message: dic["yousay"] as! String)
    }
    
    func showAlert(message: String) {
        let alert = UIAlertController(title: nil, message: message, preferredStyle: UIAlertControllerStyle.alert)
        alert.addTextField { (textField) in
            textField.placeholder = "回答"
        }
        alert.addAction(UIAlertAction.init(title: "OK", style: UIAlertActionStyle.default, handler: {[weak self](alertAction) in
            let answer = alert.textFields?.first?.text
            let js = "answer(\"\(answer!)\")"
            self?.wkView.evaluateJavaScript(js, completionHandler: { (info, error) in
                print(info)
                print(error)
            })
        }))
        self.present(alert, animated: true, completion: nil)
    }
    
    • userContentController方法中的参数message是js中postMessage传递的消息
    • wkView.evaluateJavaScrept方法用来执行js代码

    相关文章

      网友评论

      • PetitBread:webkit获取不到cookie值,保存不了登录状态。
      • insence:有没有oc的
        insence:@Qiuny 好的,谢谢
        Qiuny:@insence oc和swift的调用方法是一样的,只不过语法不同。

      本文标题:使用WebKit进行js与native交互

      本文链接:https://www.haomeiwen.com/subject/psoiyttx.html