首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

wkwebview传值到js

WKWebView 是苹果提供的用于在 iOS 应用中嵌入网页内容的组件,它允许原生应用与网页之间进行交互。将值从原生应用传递到 JavaScript 可以通过多种方式实现,以下是一些基础概念和相关方法:

基础概念

  1. WKScriptMessageHandler: 这是一个协议,允许原生应用接收来自网页的消息。
  2. WKUserContentController: 用于注册消息处理程序和管理脚本消息。
  3. WKWebViewConfiguration: 配置 WKWebView 的设置,包括用户内容控制器。

优势

  • 性能: WKWebView 比 UIWebView 更快,内存占用更低。
  • 安全性: 提供更好的沙盒环境,减少安全风险。
  • 灵活性: 支持与 JavaScript 的双向通信,便于实现复杂的交互逻辑。

类型与应用场景

  • 类型: 主要通过 evaluateJavaScript(_:completionHandler:) 方法执行 JavaScript 代码。
  • 应用场景:
    • 在电商应用中,将商品详情从原生传递到网页显示。
    • 在社交应用中,将用户信息传递给网页进行个性化展示。

实现方法

以下是一个简单的示例,展示如何从 Swift 原生代码向 JavaScript 传递数据:

Swift 代码

代码语言:txt
复制
import WebKit

class ViewController: UIViewController, WKScriptMessageHandler {
    var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let config = WKWebViewConfiguration()
        let userContentController = WKUserContentController()
        userContentController.add(self, name: "nativeBridge")
        config.userContentController = userContentController
        
        webView = WKWebView(frame: view.bounds, configuration: config)
        view.addSubview(webView)
        
        if let url = URL(string: "https://example.com/page.html") {
            let request = URLRequest(url: url)
            webView.load(request)
        }
    }

    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        if message.name == "nativeBridge", let body = message.body as? [String: Any], let data = body["data"] as? String {
            // 处理从网页发送过来的消息
            print("Received data from JS: \(data)")
            
            // 将数据传递回 JavaScript
            let jsString = "receiveNativeData('\(data)')"
            webView.evaluateJavaScript(jsString, completionHandler: nil)
        }
    }

    func sendDataToJS() {
        let data = "Hello from Swift!"
        let jsString = "receiveNativeData('\(data)')"
        webView.evaluateJavaScript(jsString, completionHandler: nil)
    }
}

HTML 和 JavaScript 代码

代码语言:txt
复制
<!DOCTYPE html>
<html>
<head>
    <title>WKWebView Example</title>
    <script>
        function receiveNativeData(data) {
            console.log("Received data from Swift: " + data);
            document.getElementById('dataDisplay').innerText = data;
        }
    </script>
</head>
<body>
    <h1>Data from Swift:</h1>
    <p id="dataDisplay"></p>
</body>
</html>

可能遇到的问题及解决方法

  1. 安全性问题: 直接拼接字符串可能导致 XSS 攻击。使用 evaluateJavaScript(_:completionHandler:) 方法可以避免这个问题。
  2. 异步问题: JavaScript 回调可能在原生代码执行完毕后才触发。确保处理好异步逻辑。
  3. 性能问题: 频繁调用 JavaScript 可能影响性能。尽量减少不必要的调用。

解决方法

  • 使用 evaluateJavaScript(_:completionHandler:): 安全且高效地执行 JavaScript 代码。
  • 优化调用频率: 避免在短时间内多次调用 JavaScript。
  • 错误处理: 在 completionHandler 中处理可能的错误。

通过以上方法,可以实现从 Swift 到 JavaScript 的数据传递,并确保应用的安全性和性能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • iOS开发中OC与H5网页交互之OC传值给JS(WKWebView)

    https://blog.csdn.net/u010105969/article/details/77414033 之前的一篇博客中给出了JS传值给OC的方法,大家可参考博客:http://blog.csdn.net.../u010105969/article/details/53541088 本篇博客则是讲了OC传值给JS,代码似乎更简单。...OC传值给JS的代码: // 页面加载完成之后调用 - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *...传值需要再网页加载完成之后进行,当初我传值给JS的是用户的登录状态,JS需要拿到用户的登录状态去进行收藏的操作。...再次提醒:这种OC给JS传参数的方式实际就是OC调用JS方法,传的值是JS方法的一个参数。 好了,博客很短,代码很简单,希望帮到那些在找OC传值给JS方法的童鞋们。

    5K20

    wkwebview加载完成_【Swift】WKWebView与JS的交互使用

    一、前言 近日,有朋友问我关于WKWebView与JS的交互问题,可我之前一直使用的是UIWebView,也不曾做过WKWebView的交互啊!...中prompt接口的实现,默认需要有一个输入框一个按钮,点击确认按钮回传输入值 //当然可以添加多个按钮以及多个输入框,不过completionHandler只有一个参数,如果有多个输入框,需要将多个输入框中的值通过某种方式拼接成一个字符串回传...修改节点的内容 let js = "document.getElementsByTagName('h2')[0].innerText = '这是一个iOS写入的方法'"; //将js注入到网页中 6、js...JSValue 是对 JavaScript 值的引用,任何 JS 中的值都可以被包装为一个 JSValue。...但是,每个 JSVirtualMachine 是不同的,即我们不能将一个 JSVirtualMachine 中创建的值传递到另一个 JSVirtualMachine 中的上下文。

    5.7K00

    传值与传地址

    很多语言在传参的时候都有一个传值和传地址(或者是引用)的问题,我想用 C++ 语言来简单的描述一下。...因为我觉得无论是传值还是传址,C 或者 C++ 这两种语言都是能够比较直观的描述清楚的语言,原因是可以容易的去观察内存。其他语言也可能可以,只是其他语言的我不太知道如何去做。...这个栈不是 JVM 的栈)然后,main 函数会把 pt 中的内容拷贝一个副本给 swap 的形参 pt,因为形参 pt 的数据在自己的栈帧中,因此,它的值交换是不会影响到 main 函数对应的栈帧中的...对于第一段和第二段代码在 C++ 中称为传值,对于第三段和第四段代码在 C++ 中称为传地址。地址和值在内存中本身都是一个值,只是具体分类是做了区别而已。...NO.6 Java 传参 Java 中说的传参全部是传值,但是当形参是一个对象的时候,其实相当于传的是一个地址。因为变量中本身就保存的是一个地址,而不是一个值。

    2.3K40

    传址与传值

    这里将讲述传址与传值的区别,先见下图。 这是传值的过程,我们明明把a,b作为实参传过去了。可以看到,交换后的a,b并没有达到我们的预期。为什么会这样呢?...其实是因为,传值的时候,形参是临时创建的,在执行完swap函数后,他们又自动销毁了,从而导致a,b的值并没有交换。如果想要改变实参的值,我们就需要进行传址,而不是传值。...见下图 我们通过把a和b的地址传给了形参,形参就能通过地址,找到a,b,以此来改变a和b的值。此时我们的实参就改为&a和&b,注意swap函数的形参类型是int*,这样就能交换a与b的值啦。...总结:传值:形参是实参的一份拷贝,函数运行起来后,实参是实参,形参和实参没有任何关联,改变形参时,不会对实参造成影响。            ...传址:形参是实参地址的一份拷贝,形参指向的实体是实参,对形参解引用后,拿到的内容就是实参,因此,对形参解引用后的内容进行修改,改变的就是实参。

    11510

    传值和传址

    往期文章 【JS ES6】const var let 一文搞懂声明关键字所有的知识点 目录 传值 什么是传值  例  传址 什么是传址 例  ---- 传值 什么是传值 let a = 1; let...b = a; console.log(a, b); //1 1 传值是获取一份儿相同的值,并自身重新开一份儿属于自己的内存地址,两个变量是互相独立的并不会互相影响。  ...例  let a = 1; let b = a; b = 2; console.log(a); console.log(b); 修改了b的值,a的值不会受到影响,这就是传值,两者是独立的存在,引用内存比较小的引用赋值一般都是传值...传址 什么是传址 let a = { name: "xiaoxie", }; let b = a; console.log(a, b); 传值是获取一份儿相同的值,不会自身重新开一份儿属于自己的内存地址...两者使用同一个内存地址,一般引用占用内存较大的变量时,会传址,比如对象和数组。

    2.7K20

    控制器到视图的传值方式

    从控制器到视图的传值方式 (1)Viewdata C:Viewdata["key"]="viewdata"//控制器中赋值 V:Viewdata["key"]//视图中取值 (2)Viewbag...,否则值会丢失,只能是在本方法到本视图 , ViewData只能在一个Action方法中进行设置,在相关的视图页面读取,只对当前视图有效。  ...强类型传值:通过对象传值(Model):必须要有一个对象的实体类 C中:返回一个对象(变量),return View(对象变量p);//p可能是单个对象也有可能是一个集合PL V中:需要一个接受从C中传来的...,与之对应的对象变量(一般为model)【可能是单个对象也有可能是集合】 例如:对于单个对象p:@model  mvc传值.Models.Student   此时model是 Student类型的一个对象...  使用model就可以访问Student类     是对于传过来的是一集合PL:   @model  List传值.Models.Student>

    1.3K20

    【iOS开发】从 UIWebView 到 WKWebView

    ② UIWebView 和 WKWebView 的区别 WKWebView 更快(占用内存可能只有 UIWebView 的1/3~1/4),没有缓存,更为细致地拆分了 UIWebViewDelegate...WKWebView 是 iOS 8 之后才有的 WebKit 中的内容,所以之前我们要同时兼容 iOS 7 和 iOS 8 的时候,可以推辞说 UIWebView 和 WKWebView 一起做太麻烦了...JS交互 在 UIWebView 中,一句简单的webView.stringByEvaluatingJavaScriptFromString() 就可以用 JS 脚本操纵 WebView,在 WKWebView...可能你也注意到了,把 JS 脚本注入到 WebView 的途径是初始化一个 WebView,所以你需要在 WebView 初始化之前写好自己的脚本。...当然如果你不需要 JS 交互,直接用一个 frame 来初始化 WebView,去掉 configuration 参数就好了。

    1.8K20
    领券