WKWebView、WebView和JS的交互方式详解

yizhihongxing

WKWebView、WebView和JS的交互方式详解

在网页开发中,经常需要在客户端和网页之间进行数据的交互,其中就涉及到了WKWebView、WebView和JavaScript的交互。下面详细讲解一下三者的交互方式。

WKWebView和JavaScript的交互

WKWebView是iOS 8以上版本中,替换UIWebView的新型控件,并且在性能,稳定性,兼容性等方面皆有不小的提升。WKWebView的JavaScript交互主要分为以下几个步骤:

  1. 首先需要将WKWebView中的web contentController设置为WKUserContentController,以监听JavaScript的调用。

    let userContentController = WKUserContentController()
    userContentController.add(self, name: "xxx")
    let configuration = WKWebViewConfiguration()
    configuration.userContentController = userContentController
    let webView = WKWebView(frame: self.view.bounds, configuration: configuration)
    
  2. 通过add函数向WKUserContentController添加messageHandler,这里的xxx表示JS中调用该接口时所需传递的名称。

    userContentController.add(self, name: "xxx")
    
  3. 在WKScriptMessageHandler协议中,实现userContentController手工添加的JS调用方法。

    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        if message.name == "xxx" {
            // 收到JS调用
        }
    }
    
  4. JS端可以通过window.webkit.messageHandlers.xxx.postMessage('xxxx')方法向原生客户端发送信息,在客户端中,WKScriptMessageHandler协议的接口方法会被调用。

下面是一份Swift的示例代码:

import UIKit
import WebKit

class ViewController: UIViewController, WKScriptMessageHandler {

    override func viewDidLoad() {
        super.viewDidLoad()

        let userContentController = WKUserContentController()
        userContentController.add(self, name: "xxx")
        let configuration = WKWebViewConfiguration()
        configuration.userContentController = userContentController
        let webView = WKWebView(frame: self.view.bounds, configuration: configuration)
        self.view.addSubview(webView)

        let urlStr = "https://www.baidu.com"
        let url = URL(string: urlStr)!
        let request = URLRequest(url: url)
        webView.load(request)
    }

    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        if message.name == "xxx" {
            // 收到JS调用
        }
    }
}

WebView和JavaScript的交互

WebView是Android平台上的Web浏览器控件,WebView 和 JavaScript 的交互主要采用Android提供的接口方法:

  1. 首先需要启用WebView的JavaScript调用能力。

    webView.setting.javaScriptEnabled = true
    
  2. 通过addJavascriptInterface函数向WebView添加Message对象,这样JavaScript代码就可以通过对象方式调用原生应用程序的方法。

    class Message {
        fun show(message: String) {
            // 该方法用来打印传入的消息
        }
    }
    
    webView.addJavascriptInterface(Message(), "native")
    
  3. 通过WebView.loadUrl()方法加载包含JavaScript代码的网页,网页代码就可以通过添加的对象“native”方式调用Android客户端。

下面是一份Kotlin的示例代码:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val webView = findViewById<WebView>(R.id.webView)
        webView.settings.javaScriptEnabled = true

        val message = Message()
        webView.addJavascriptInterface(message, "native")

        val url = "file:///android_asset/test.html"
        webView.loadUrl(url)
    }

    private inner class Message {
        @JavascriptInterface
        fun show(message: String) {
            // 该方法用来打印传入的消息
        }
    }
}

JS和原生客户端交互示例

// JS代码
function nativeMethod() {
    window.webkit.messageHandlers.xxx.postMessage('Hello World!')
}

// Swift代码
class ViewController: UIViewController, WKScriptMessageHandler {

    override func viewDidLoad() {
        super.viewDidLoad()

        let userContentController = WKUserContentController()
        userContentController.add(self, name: "xxx")
        let configuration = WKWebViewConfiguration()
        configuration.userContentController = userContentController
        let webView = WKWebView(frame: self.view.bounds, configuration: configuration)
        self.view.addSubview(webView)

        let urlStr = "https://www.baidu.com"
        let url = URL(string: urlStr)!
        let request = URLRequest(url: url)
        webView.load(request)
    }

    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        if message.name == "xxx" {
            let alert = UIAlertController(title: nil, message: message.body as? String, preferredStyle: .alert)
            let action = UIAlertAction(title: "OK", style: .default, handler: nil)
            alert.addAction(action)
            self.present(alert, animated: true, completion: nil)
        }
    }
}

// Kotlin代码
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val webView = findViewById<WebView>(R.id.webView)
        webView.settings.javaScriptEnabled = true

        val message = Message()
        webView.addJavascriptInterface(message, "native")

        val url = "file:///android_asset/test.html"
        webView.loadUrl(url)
    }

    private inner class Message {
        @JavascriptInterface
        fun show(message: String) {
            val alertDialog = AlertDialog.Builder(this@MainActivity).create()
            alertDialog.setTitle(null)
            alertDialog.setMessage(message)
            alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK") { _, _ -> }
            alertDialog.show()
        }
    }
}

以上是WKWebView、WebView和JavaScript的交互方式的详细讲解及示例代码。建议开发者们在实际开发中结合自身需要和场景使用相应的交互方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:WKWebView、WebView和JS的交互方式详解 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • Three.js中网格对象MESH的属性与方法详解

    当使用Three.js创建基于WebGL的3D图形时,网格对象Mesh是最常用的3D对象之一。在这篇攻略中,我们将详细讲解Mesh对象的属性与方法,帮助您更好地使用Three.js创建出令人惊叹的3D交互页面。 Mesh的基本构造函数 Mesh对象是由几何体Geometry和材质Material组成的。创建Mesh对象的基本构造函数如下所示: Mesh(ge…

    JavaScript 2023年6月10日
    00
  • js判断浏览器类型,版本的代码(附多个实例代码)

    当我们开发web应用程序时,我们常常需要检测用户的浏览器类型和版本,以确保网站的功能在不同浏览器上的兼容性。以下是检测浏览器类型,版本的Javascript代码的攻略。 一、通过userAgent检测 Javascript可以通过navigator.userAgent来获取浏览器的用户代理字符串,然后从中提取浏览器类型和版本号。 let userAgent …

    JavaScript 2023年6月11日
    00
  • Element Carousel 走马灯的具体实现

    要实现一个Element Carousel 走马灯需要以下几个步骤: 1.引入Element库和样式表 在HTML文件中引入Element库和样式表 <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css&quo…

    JavaScript 2023年6月10日
    00
  • JavaScript 中的输出数据多种方式

    JavaScript 中的输出数据多种方式,下面介绍几种常用方式: console.log() console.log() 是在浏览器控制台输出信息的最常用方式之一,可以输出字符串、数字、布尔值等,也可以输出对象或数组。示例如下: console.log(‘Hello, World!’); // 输出字符串 console.log(123); // 输出数字…

    JavaScript 2023年5月28日
    00
  • JS实现同一DOM元素上onClick事件与onDblClick事件并存的解决方法

    当我们需要给同一DOM元素绑定onClick事件和onDblClick事件时,我们会发现这两个事件会产生冲突,无法同时生效。那么该如何解决呢?下面是完整攻略: 1. 解决方法 我们可以通过以下两种方式实现同一DOM元素上onClick事件与onDblClick事件并存: 1.1. 使用setTimeout 我们可以通过使用setTimeout函数来延迟执行o…

    JavaScript 2023年6月10日
    00
  • json2.js的初步学习与了解

    Json2.js的初步学习与了解 1. 什么是Json2.js? Json2.js是一个JS库,提供了一组非常方便的json解析和生成工具,可以用来编码和解码JSON数据。提供了两个核心方法 JSON.parse(str)和JSON.stringify(obj)。JSON.parse(str)方法可以把一个包含JSON格式的字符串转换为JavaScript对…

    JavaScript 2023年6月11日
    00
  • JavaScript实现简单的倒计时效果

    实现倒计时效果是网站开发中比较常见的需求之一,JavaScript可以轻松地实现倒计时功能。下面我将提供完整的攻略,详细讲解如何实现简单的倒计时效果。 1. 核心方法 实现倒计时的核心就是获取当前时间和目标时间,计算时间差,然后实现倒计时。下面是JavaScript代码实现核心方法: function countDown() { // 获取当前时间戳 con…

    JavaScript 2023年5月27日
    00
  • Javascript 中的类和闭包

    JavaScript 中的类和闭包都是比较高级的概念,如果要深入理解和应用它们,需要比初学者更深入的探索。 类 在 JavaScript 中,使用class关键字创建类是一种比较新的方法。使用类的好处是可以更简洁地定义对象,而不需要过多的对象字面量。类可以包含构造函数、属性和方法。下面是一个简单的类的示例: class Animal { constructo…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部