需求:利用webView加载H5页面,并实现点击H5页面的按钮触发事件,事件是调用OC的方法。
简单说就是JS调用OC的方法,这里我们选择的是WKWebView,至于为什么不用UIWebView,自行百度或者看开发文档。
实现:
1、首先应该倒入 WebKit 框架 #import <WebKit/WebKit.h>

2、懒加载一个webView

//需要的代理
<WKUIDelegate,WKNavigationDelegate,WKScriptMessageHandler> @property (nonatomic , strong) WKWebView *webView; - (WKWebView *)webView{
if (!_webView) {
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc]init];
_webView = [[WKWebView alloc]initWithFrame:CGRectMake(0, NAVHEIGHT, SCREEN_WIDTH, SCREEN_HEIGHT-NAVHEIGHT) configuration:config];
if (@available(iOS 11.0, *)) {
            [configuration setURLSchemeHandler:self.handler forURLScheme:@"webImage"];
        }
_webView.UIDelegate = self;
_webView.navigationDelegate = self;
NSURLRequest *request = [[NSURLRequest alloc]initWithURL:[NSURL URLWithString:self.structureUrl]];
[_webView loadRequest:request];
} return _webView; }

3、JS端的方法构成HTML代码:

切记在html中预留接口,格式必须是固定的:

window.webkit.messageHandlers.actionName.postMessage('parameter');
actionName:为方法名
parameter:为传递过来的参数,在html中叫做对象,到OC我们这里就是字典

举个例子:

window.webkit.messageHandlers.actionName.postMessage('parameter');
actionName:为方法名
parameter:为传递过来的参数,在html中叫做对象,到OC我们这里就是字典

这里我们没有带参数,要是需要参数,就让前端加上,你不会没关系,也不需要你会,前端知道该怎么做。

4、OC端添加JS方法处理器:

  WKUserContentController *userContentController = _webView.configuration.userContentController;
[userContentController addScriptMessageHandler:self name:@"callPhone"];
[userContentController addScriptMessageHandler:self name:@"add"];
[userContentController addScriptMessageHandler:self name:@"edit"];
[userContentController addScriptMessageHandler:self name:@"delete"];

这里我们添加了了四个方法,切记着四个方法的名称无比与JS端一致。

5、实现WKScriptMessageHandler代理方法

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
NSLog(@"ScriptMessage 传递的消息内容 : %@",message.body);
if ([message.name isEqualToString:@"callPhone"]) {
}
if ([message.name isEqualToString:@"add"]) {
}
if ([message.name isEqualToString:@"edit"]) {
}
if ([message.name isEqualToString:@"delete"]) {
}
}

6、在界面消失的时候清除JS方法

- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated]; [self.webView.configuration.userContentController removeScriptMessageHandlerForName:@"callPhone"];
[self.webView.configuration.userContentController removeScriptMessageHandlerForName:@"add"];
[self.webView.configuration.userContentController removeScriptMessageHandlerForName:@"edit"];
[self.webView.configuration.userContentController removeScriptMessageHandlerForName:@"delete"];
 }

到这里就结束了,当你点击 webView 上的按钮时,就能够进入我们的OC方法里。
总结起来就三点内容:
1.前端和苹果移动端的方法名必须一致,且前端要以固定的格式来写方法,否则移动端收不到事件反馈;
2.通过 WKUserContentController 添加html中预留的方法;
3.实现 WKScriptMessageHandler 的代理方法;

iOS开发 WKWebView实现JS交互的更多相关文章

  1. ios WKWebView 与 JS 交互实战技巧

    一.WKWebView 由于Xcode8发布之后,编译器开始不支持iOS 7了,这样我们的app也改为最低支持iOS 8.0,既然需要与web交互,那自然也就选择使用了 iOS 8.0之后 才推出的新 ...

  2. iOS下原生与JS交互(总结)

    iOS开发免不了要与UIWebView打交道,然后就要涉及到JS与原生OC交互,今天总结一下JS与原生OC交互的两种方式. JS调用原生OC篇(我自己用的方式二,简单方便) 方式一 第一种方式是用JS ...

  3. iOS开发--OC调用JS篇

    OC调用JS篇 其中相对应的html部分如下: <html> <header> <meta http-equiv="Content-Type" con ...

  4. 转载 【iOS开发】网页JS与OC交互(JavaScriptCore) OC ----->JS

      目标 本文介绍利用苹果在iOS7时发布的JavaScriptCore.framework框架进行js与OC的交互.我们想要达到的目标是: OC调用网页上的js方法 网页js调用APP中的OC方法 ...

  5. WKWebView与JS交互,UIWebView+JavascriptCore和JS交互

    最近一直在做有关Swift和JavaScript交互的程序,所以有关UIWebView和WKWebView在使用上的差别在此总结下: UIWebView: (1)创建 var webView: UIW ...

  6. WKWebView与Js交互

    首先打开webstorm,将最下面h5拷贝到html中.然后导入工程 #define kMessageHandlerName @"mymobile" 1.创建配置类 - (WKWe ...

  7. iOS中UIWebView使用JS交互

    iOS中偶尔也会用到webview来显示一些内容,比如新闻,或者一段介绍.但是用的不多,现在来教大家怎么使用js跟webview进行交互. 这里就拿点击图片获取图片路径为例: 1.测试页面html & ...

  8. WKwebView与JS交互(h5主动)

    先:WKUIDelegate,WKNavigationDelegate,WKScriptMessageHandler // 创建一个webiview的配置项 WKWebViewConfiguratio ...

  9. iOS中UIWebView使用JS交互 - 机智的新手

    iOS中偶尔也会用到webview来显示一些内容,比如新闻,或者一段介绍.但是用的不多,现在来教大家怎么使用js跟webview进行交互. 这里就拿点击图片获取图片路径为例: 1.测试页面html & ...

  10. iOS web view 与 js 交互

    移动应用中许多复杂的且经常改动的页面会使用H5进行代替native,这里就会使用到js和webview的交互 iOS里面,UIWebView提供了方法stringByEvaluatingJavaScr ...

随机推荐

  1. JS 开始时间/结束时间和当前时间进行比较

    项目需求:到截止日期一些功能不可以再使用,那么需要判断当前时间与截止时间进行比较,记录一下吧 注意: 1.橙色字体的代码换成你自己的变量 2. .valueOf()其实就是将中国时间转为时间戳 3.截 ...

  2. protected virtual 使用

    转载摘自:https://blog.csdn.net/qq_31116753/article/details/81203416 1.使用protected访问修饰符标记的方法或字段,只能在当前类及其子 ...

  3. 【转载】C++标准库容器与C#容器对比

    转载自栈他喵的又溢出了 我简单的整理一下,方便观看: C#容器 C++容器 备注 Array C array .net的Array可以是非0起始索引(鸡肋?查了一下,用Array.CreateInst ...

  4. lua如何转化为exe

    在这里下载    https://wwn.lanzout.com/iIS9d07rpesh 然后用cmd到 下载的盘:\luapack\luapack\bin\Debug 然后glue.exe srl ...

  5. flutter SliverPersistentHeader子组件透明度渐变【滑动悬停appbar添加自定义组件的透明度】

    在开发flutter悬停头部中,发现一个问题. 我们通常使用SliverAppBar(),去实现悬停的功能,在使用appbar的时候满足不了我们的需求,就需要自定义, 如下:在title中写了一个搜索 ...

  6. 谷歌云|机密 GKE 节点可在计算优化的 C2D 虚拟机上使用

    机密 GKE 节点可用于计算优化的 C2D 虚拟机. 许多公司已采用 Google Kubernetes Engine (GKE) 作为其应用程序基础架构中的关键组件.在某些情况下,使用容器和 Kub ...

  7. python之目录结构01

    本文档主要是自己学习巩固以及复习之用,主要写些自己的学习体会! 以下为一个简要的目录构: Foo/ |-- bin/ | |-- foo | |-- foo/ | |-- tests/ | | |-- ...

  8. 第三周day1

    第三周day1,星期一 所花时间(上课时间+练习时间):6h 代码量:110 博客量:2 所学到的知识:学了一些Map的相关知识,还有如何切割字符串,如何将字符串转换成字符数组str.toCharAr ...

  9. 在java路径上找不到javax.servlet.http.HttpServlet

    1.将写好的网页代码导入Java中会发现index.jsp文件开头部分出现报错 2.错误提示是找不到java路径问题 3.在项目中鼠标右键进行找到Build Path选项点击进去 4.找到Librar ...

  10. Excel error - the macros in this project are disabled, please refer to the online help or documentation of the host application to determine how to enable macros.

    alt+F11 进入vba界面,F5运行macro后报错. Sub 合并当前工作簿下的所有工作表() Application.ScreenUpdating = False For j = 1 To S ...