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交互的两种方式相关推荐

  1. react 调用 html5,React-Native Webview 和H5交互的两种方式

    React-Native WebView 和H5交互有两种方式: 方式1:RN Webview 向H5注入JS 此方式可作为Webview向H5端传递数据. RN Webview 有以下属性,可以注入 ...

  2. 前后端交互的两种方式

    方式一:表单提交 表单(form):表单用于收集用户输入信息,并将数据提交给服务器.是一种常见的与服务端数据交互的一种方式 //1. action:指定表单的提交地址 //2. method:指定表单 ...

  3. JS 下载文件两种方式总结

    后端返回Blob对象(文件流),完成导出.下载功能: 1.介绍Blob Blob Blob 对象表示一个不可变.原始数据的类文件对象.它的数据可以按文本或二进制的格式进行读取,也可以转换成 Reada ...

  4. 以太坊智能合约交互调用,web3.js,web3j两种方式实现

    导语 接上篇文章 <使用hardhat部署solidity智能合约到测试网> 部署完合约之后,那么如何区块链进行交互呢?这节的主要内容就是使用web3.js和web3j来与区块链以及链上的 ...

  5. wap ios android,wap 唤起App 的两种方式Schema Universal Link

    1.schema 现在线上大多数 App 使用的就是 schema 跳转,都对应一套路由法则,基本都能做到跳转到 App 内任一界面. location.href?=?'schema://xxxx' ...

  6. 【javaWeb】前后端传递数据交互的两种方式

    一.使用struct2的方法set及get 1.在jsp中直接定义定义form表单 <form id="formid" name= "myform" me ...

  7. iOS无限轮播图片的两种方式

    2019独角兽企业重金招聘Python工程师标准>>> 1 使用UIScrollview实现无限轮播原理 在开发中常需要对广告或者是一些图片进行自动的轮播,也就是所谓的无限滚动. 在 ...

  8. iOS 判断设备是否越狱(两种方式结合判断)

    越狱测试仅限真机 + (BOOL)JailBreak{BOOL status1 = NO;BOOL status2 = NO;//根据是否能打开cydia判断status1 = [[UIApplica ...

  9. JS深拷贝实现两种方式

    递归复制方式: function deepClone(obj) {let res = Array.isarray(obj) ? obj : {};for (let key in obj){if (ob ...

最新文章

  1. 电流如何在导线中传播
  2. 从京东裸辞 2 年后,我的一些改变
  3. 生成allure测试报告时报错的解决方法
  4. java 句柄 内存_Java内存区域学习
  5. linux系统——fread()与read()函数族区别
  6. linux ubuntu 关于vim得一些基本命令
  7. [Cocos2d-x]Cocos2d-x 3.2 学习笔记
  8. 2月25日线上见!iQOO 3发布会官宣:定义新速度
  9. 解决CodeBlocks中文不显示的问题
  10. jquery中防止和其他JS框架冲突的办法
  11. SQL Server数据库可疑处理
  12. 线性代数及其应用(第三版)1.3节习题解答
  13. php获取客户端的真实IP的方法
  14. 计算机怎么语音通话,微信电脑版怎么语音聊天?微信电脑版语音聊天教程
  15. 生活不止有诗和远方,也有眼前的美好。也许你心里有清风明月,
  16. web 上传文件到ftp服务器,web 上传文件到ftp服务器上
  17. FLASH烧写(简单概括)
  18. 经典算法系列之不死神兔
  19. 剪枝中的train from scratch的解释
  20. PCF8574AT的I2C地址和单独IO操作

热门文章

  1. SQL查询一张表插入到另一张表
  2. web前端开发 —— 一个对联效果
  3. [转]gcc下程序调用静态库编译命令:主文件必须在静态库前面!
  4. div+css布局与seo的关系
  5. 2019北京国际智慧城市、物联网、大数据博览会
  6. iOS多线程系列之GCD栅栏(barrier)实现同步锁
  7. 给 layui upload 带每个文件的进度条, .net 后台代码
  8. OSGI常用控制台命令
  9. JavaScript + CSS3 实现的海报画廊特效
  10. 安装 Python IDLE (Linux)