iOS WKWebview JS与OC互相调用,传递数据

本文详细介绍了如何使用WKWebView在iOS应用中实现JavaScript与Objective-C的双向通信。包括如何注册JS方法供OC调用,以及OC如何通过WKWebView向JS传递数据。通过实例展示了懒加载生成WKWebView的方法,并提供了OC向JS传递值的具体代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:
WKWebView是一个展示交互式web内容的视图,支持iOS8.0及macOS10.10以上的系统。提供了替换UIWebView的组件, WKWebView解决了UIWebView加载速度慢,占用内存多,优化困难等问题,可以说WKWebView是目前App内部加载网页的最佳选择。

 

目录

1.JS 与 OC 交互

 2.OC 向 JS 传递值


1.JS 与 OC 交互

添加注入JS 的方法

//注册一个name为jsToOcNoPrams的js方法 设置处理接收JS方法的对象
[wkUController addScriptMessageHandler:weakScriptMessageDelegate  name:@"JSToOcNoPrams"];

 [wkUController addScriptMessageHandler:weakScriptMessageDelegate  name:@"JSToOcWithPrams"];

JS 端代码示例

<!--        JS语法-->
    <script type = "text/javascript">
        
    function JSToOcFunction1()
    {
       window.webkit.messageHandlers.JSToOcNoPrams.postMessage({});
    }
    
    function JSToOcFunction2()
    {
        window.webkit.messageHandlers.JSToOcWithPrams.postMessage({"params":"我是参数"});
    }

懒加载生成一个 webView

- (WKWebView *)webView {
    if (_webView == nil) {
        _userContentController = [[WKUserContentController alloc] init];
        
        _config = [[WKWebViewConfiguration alloc]init];
        _config.userContentController = _userContentController;
        _config.allowsInlineMediaPlayback = YES;
        
        WKPreferences *preferences = [WKPreferences new];
        preferences.javaScriptCanOpenWindowsAutomatically = YES;
        preferences.minimumFontSize = 12.0;
	 _config.preferences = preferences;

			 //这个类主要用来做native与JavaScript的交互管理
		 WKUserContentController * wkUController = [[WKUserContentController alloc] init];
			 //注册一个name为jsToOcNoPrams的js方法 设置处理接收JS方法的对象
		 [wkUController addScriptMessageHandler:weakScriptMessageDelegate  name:@"jsToOcNoPrams"];
		 [wkUController addScriptMessageHandler:weakScriptMessageDelegate  name:@"jsToOcWithPrams"];

		 _config.userContentController = wkUController;

		 _webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:_config];
		 _webView.UIDelegate = self;
		 _webView.navigationDelegate = self;
		//_webView.opaque = NO;
		 _webView.backgroundColor = [UIColor whiteColor];
		_webView.allowsBackForwardNavigationGestures = YES;/// 是否允许手势左滑返回上一级, 类似导航控制的左滑返回
		// 设置没有弹性
		_webView.scrollView.bounces = NO;

    }
    return _webView;
}

代理方法拿到到 JS 的数据

#pragma mark - WKScriptMessageHandler
//实现js注入方法的协议方法
- (void)userContentController:(WKUserContentController *)userContentController
      didReceiveScriptMessage:(WKScriptMessage *)message {

    NSLog(@"JS方法名:%@", message.name);
    NSLog(@"JS参数:%@", message.body);
    //找到对应js端的方法名,获取messge.body
    if ([message.name isEqualToString:@"JSToOcNoPrams"]) {

    // 根据传过来的值处理逻辑、跳转页面等等
    HikRealplayViewController *vc = [[HikRealplayViewController alloc]init];
	vc.title = message.body[@"title"];
	[self.navigationController pushViewController:vc animated:YES];
    
       
    }
}

 2.OC 向 JS 传递值

#pragma mark - WKNavigationDelegate

// 页面加载完成之后调用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
    NSLog(@"加载结束");

	NSString *jsStr = [NSString stringWithFormat:@"ocSetDeviceCode('%@')",[ZJPNetWork getUUID]];

	[self.webView evaluateJavaScript:jsStr completionHandler:^(id _Nullable result, NSError * _Nullable error) {
		NSLog(@"%@--%@",result,error);
	}];
}

@"ocSetDeviceCode('%@')",[ZJPNetWork getUUID]] , ocSetDeviceCode是方法名称,('%@')表示参数

2. JS端获取传递值代码实现实例

    function ocSetDeviceCode(value){
           // 此处 js接受到值
     }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡卡西Sensei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值