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

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日

相关文章

  • JavaScript 应用技巧集合[推荐]

    JavaScript 应用技巧集合[推荐] 概述 这是一篇涵盖 JavaScript 应用技巧的文章,旨在通过对常用的应用场景进行剖析和实例演示,帮助读者更加深入地理解 JavaScript 并掌握一些实用技巧。 目录 模块化编程 异步编程 函数式编程 代码优化 ES6 语法 模块化编程 在大型项目中,代码的组织和管理变得至关重要。模块化编程是一种构建可维护…

    JavaScript 2023年6月1日
    00
  • js获取url传值的方法

    获取URL中传递的参数是JavaScript中常用的一个功能,以下是一些常见的方法: 1.使用location对象的search属性 URL中的查询参数可以通过location对象的search属性获得。该属性返回包含问号(?)的参数串,例如: console.log(location.search); // 输出 ?id=123&name=John…

    JavaScript 2023年6月10日
    00
  • Javascript 日期处理之时区问题

    Javascript 日期处理之时区问题 介绍 在JavaScript日期处理中,时区问题经常是一个麻烦之处。本文将围绕着JavaScript日期处理中的时区问题进行讲解和说明。 时区概念 首先要了解的是,时区是以一个中央参考点为基础,通过24小时来计算时间的一种标准化的时间概念。时区一般可以通过偏差量来表示,例如北京时间是GMT+8。 JavaScript…

    JavaScript 2023年5月27日
    00
  • javascript静态的url如何传递

    在JavaScript中,静态的URL(Uniform Resource Locator)可以通过多种方法进行传递。以下是几种可行的方法。 方法一:使用全局变量 在JavaScript中,可以使用全局变量来存储静态的URL,并在需要的时候使用它们。这种方法虽然简单,但存在安全和可维护性方面的问题。 // 存储静态URL的全局变量 var staticUrl …

    JavaScript 2023年6月11日
    00
  • javascript动态加载实现方法一

    首先我们需要明确一下“javascript动态加载”是什么意思。 “javascript动态加载”指的是通过JavaScript在网页运行过程中动态加载(或移除)外部脚本或样式表等资源文件,而不是在HTML中直接使用<script>或<link>标签引用。 接下来我们来介绍一下“javascript动态加载实现方法一”的完整攻略,包括…

    JavaScript 2023年5月27日
    00
  • JSON 入门教程基础篇 json入门学习笔记

    JSON 入门教程基础篇 json入门学习笔记 本文主要介绍JSON的基础知识,包括JSON是什么、JSON的语法格式、如何解析JSON数据等,读者可以通过本文学习到JSON的基础知识并能够进行简单的JSON数据解析。 什么是JSON JSON全称为JavaScript Object Notation,它是一种轻量级的数据交换格式。JSON以纯文本的形式表示…

    JavaScript 2023年5月27日
    00
  • jQuery表单验证之密码确认

    本文将为您提供简明易懂的jQuery表单验证之密码确认攻略。我们将提供完整的步骤和示例说明,帮助您解决表单验证过程中的疑难问题。 步骤一:引入jQuery库和验证插件 首先,您需要引入jQuery库和验证插件,以便您可以轻松地在网站上进行表单验证。您可以在以下位置找到jQuery库和验证插件: <script src="https://cod…

    JavaScript 2023年6月10日
    00
  • 使用onbeforeunload属性后的副作用

    使用onbeforeunload属性后的副作用可能会影响到用户的体验,因为当用户尝试关闭页面或者离开页面时,浏览器会弹出一个对话框,询问用户是否确定要离开当前页面。 在使用onbeforeunload属性时,有两个潜在的副作用: 对于复杂的单页应用,当用户尝试离开页面时,可能会触发onbeforeunload事件。即使用户仅仅是在应用中导航到不同的页面或者进…

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