iOS WKWebView和JS交互的两种方式
2019独角兽企业重金招聘Python工程师标准>>>
本文介绍两种方式实现iOS WKWebView和JS交互
- WKWebViewConfiguration注入WKScriptMessageHandler
- UIWebViewDelegate回调方法中处理
WKWebViewConfiguration注入WKScriptMessageHandler
网页很简单,只有一个按钮,点击按钮会触发一个方法,在事件的方法中通过调用 window.webkit.messageHandlers.NativeModel.postMessage({name: 'zhangyutang', age: 12});
把消息发送给Objc。Objc中需要注入相同名称的model:NativeModel
。网页代码如下
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>html5page-oc</title><script>function btn1Click() {window.webkit.messageHandlers.NativeModel.postMessage({name: 'zhangyutang', age: 12});alert("after call");}</script></head>
<body><input type="button" value="button c" onclick="btn1Click()"></body>
</html>
Objc代码中在初始化WKWebView
的时候需要使用initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration
方法来进行初始化。 WKWebViewConfiguration
对象需要使用调用方法 addScriptMessageHandler:name
来设置JS事件的接收处理器,addScriptMessageHandler:name
方法有两个参数:ScriptMessageHandler
参数需要是一个实现WKScriptMessageHandler
了协议的对象;name
参数是H5页面中调用postMessage
方法使用到的注入对象的名称,H5页面和原生的页面交互使用通过该对象才可以成功调用。
- (WKWebView *)webView {if (!_webView) {WKWebViewConfiguration* config = [[WKWebViewConfiguration alloc] init];config.userContentController = [WKUserContentController new];[config.userContentController addScriptMessageHandler:self name:@"NativeModel"];_webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:config];_webView.navigationDelegate = self;}return _webView;
}
MMWebViewController
类实现了实现 WKScriptMessageHandler
协议,重写 userContentController:didReceiveScriptMessage
回调方法 ,在该方法中处理JS的方法调用,关键的代码片段如下。
@interface MMWebViewController () <WKScriptMessageHandler>@end@implementation MMWebViewController#pragma mark - ......::::::: WKScriptMessageHandler :::::::......- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {id body = message.body;NSLog(@"=== %@", body);
}@end
UIWebViewDelegate回调方法中处理
重写UIWebViewDelegate
的回调方法- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
,在该方法中通过判断请求的URL的scheme
来处理特定URL,可以处理原生页面的跳转、原生页面的弹窗等业务逻辑,然后调用decisionHandler(WKNavigationActionPolicyCancel);
告诉WKWebView
不用处理这个请求,这个请求已经让原生处理了。简单的代码片段如下
if ([navigationAction.request.URL.scheme isEqualToString:@"plush"]) {[PTLinkUtil handleURLString:navigationAction.request.URL.absoluteString linkType:PTLinkCustomHandler roomID:0];decisionHandler(WKNavigationActionPolicyCancel);return;} else if ([[navigationAction.request.URL.scheme lowercaseString] isEqualToString:@"lezhua"]) {if ([[navigationAction.request.URL.host lowercaseString] isEqualToString:@"home"]) {NSArray *queryItems = [NSURLComponents componentsWithString:navigationAction.request.URL.absoluteString].queryItems;for (NSInteger i = 0; i < queryItems.count; i++) {NSURLQueryItem *loopItem = queryItems[i];if ([[loopItem.name lowercaseString] isEqualToString:@"segmentid"]) {[UIUtil showWithSegmentID:[validString(loopItem.value) integerValue]];}}}decisionHandler(WKNavigationActionPolicyCancel);return;}
转载于:https://my.oschina.net/FEEDFACF/blog/841472
iOS WKWebView和JS交互的两种方式相关推荐
- react 调用 html5,React-Native Webview 和H5交互的两种方式
React-Native WebView 和H5交互有两种方式: 方式1:RN Webview 向H5注入JS 此方式可作为Webview向H5端传递数据. RN Webview 有以下属性,可以注入 ...
- 前后端交互的两种方式
方式一:表单提交 表单(form):表单用于收集用户输入信息,并将数据提交给服务器.是一种常见的与服务端数据交互的一种方式 //1. action:指定表单的提交地址 //2. method:指定表单 ...
- JS 下载文件两种方式总结
后端返回Blob对象(文件流),完成导出.下载功能: 1.介绍Blob Blob Blob 对象表示一个不可变.原始数据的类文件对象.它的数据可以按文本或二进制的格式进行读取,也可以转换成 Reada ...
- 以太坊智能合约交互调用,web3.js,web3j两种方式实现
导语 接上篇文章 <使用hardhat部署solidity智能合约到测试网> 部署完合约之后,那么如何区块链进行交互呢?这节的主要内容就是使用web3.js和web3j来与区块链以及链上的 ...
- wap ios android,wap 唤起App 的两种方式Schema Universal Link
1.schema 现在线上大多数 App 使用的就是 schema 跳转,都对应一套路由法则,基本都能做到跳转到 App 内任一界面. location.href?=?'schema://xxxx' ...
- 【javaWeb】前后端传递数据交互的两种方式
一.使用struct2的方法set及get 1.在jsp中直接定义定义form表单 <form id="formid" name= "myform" me ...
- iOS无限轮播图片的两种方式
2019独角兽企业重金招聘Python工程师标准>>> 1 使用UIScrollview实现无限轮播原理 在开发中常需要对广告或者是一些图片进行自动的轮播,也就是所谓的无限滚动. 在 ...
- iOS 判断设备是否越狱(两种方式结合判断)
越狱测试仅限真机 + (BOOL)JailBreak{BOOL status1 = NO;BOOL status2 = NO;//根据是否能打开cydia判断status1 = [[UIApplica ...
- JS深拷贝实现两种方式
递归复制方式: function deepClone(obj) {let res = Array.isarray(obj) ? obj : {};for (let key in obj){if (ob ...
最新文章
- 电流如何在导线中传播
- 从京东裸辞 2 年后,我的一些改变
- 生成allure测试报告时报错的解决方法
- java 句柄 内存_Java内存区域学习
- linux系统——fread()与read()函数族区别
- linux ubuntu 关于vim得一些基本命令
- [Cocos2d-x]Cocos2d-x 3.2 学习笔记
- 2月25日线上见!iQOO 3发布会官宣:定义新速度
- 解决CodeBlocks中文不显示的问题
- jquery中防止和其他JS框架冲突的办法
- SQL Server数据库可疑处理
- 线性代数及其应用(第三版)1.3节习题解答
- php获取客户端的真实IP的方法
- 计算机怎么语音通话,微信电脑版怎么语音聊天?微信电脑版语音聊天教程
- 生活不止有诗和远方,也有眼前的美好。也许你心里有清风明月,
- web 上传文件到ftp服务器,web 上传文件到ftp服务器上
- FLASH烧写(简单概括)
- 经典算法系列之不死神兔
- 剪枝中的train from scratch的解释
- PCF8574AT的I2C地址和单独IO操作