iOS开发 WKWebView实现JS交互
需求:利用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交互的更多相关文章
- ios WKWebView 与 JS 交互实战技巧
一.WKWebView 由于Xcode8发布之后,编译器开始不支持iOS 7了,这样我们的app也改为最低支持iOS 8.0,既然需要与web交互,那自然也就选择使用了 iOS 8.0之后 才推出的新 ...
- iOS下原生与JS交互(总结)
iOS开发免不了要与UIWebView打交道,然后就要涉及到JS与原生OC交互,今天总结一下JS与原生OC交互的两种方式. JS调用原生OC篇(我自己用的方式二,简单方便) 方式一 第一种方式是用JS ...
- iOS开发--OC调用JS篇
OC调用JS篇 其中相对应的html部分如下: <html> <header> <meta http-equiv="Content-Type" con ...
- 转载 【iOS开发】网页JS与OC交互(JavaScriptCore) OC ----->JS
目标 本文介绍利用苹果在iOS7时发布的JavaScriptCore.framework框架进行js与OC的交互.我们想要达到的目标是: OC调用网页上的js方法 网页js调用APP中的OC方法 ...
- WKWebView与JS交互,UIWebView+JavascriptCore和JS交互
最近一直在做有关Swift和JavaScript交互的程序,所以有关UIWebView和WKWebView在使用上的差别在此总结下: UIWebView: (1)创建 var webView: UIW ...
- WKWebView与Js交互
首先打开webstorm,将最下面h5拷贝到html中.然后导入工程 #define kMessageHandlerName @"mymobile" 1.创建配置类 - (WKWe ...
- iOS中UIWebView使用JS交互
iOS中偶尔也会用到webview来显示一些内容,比如新闻,或者一段介绍.但是用的不多,现在来教大家怎么使用js跟webview进行交互. 这里就拿点击图片获取图片路径为例: 1.测试页面html & ...
- WKwebView与JS交互(h5主动)
先:WKUIDelegate,WKNavigationDelegate,WKScriptMessageHandler // 创建一个webiview的配置项 WKWebViewConfiguratio ...
- iOS中UIWebView使用JS交互 - 机智的新手
iOS中偶尔也会用到webview来显示一些内容,比如新闻,或者一段介绍.但是用的不多,现在来教大家怎么使用js跟webview进行交互. 这里就拿点击图片获取图片路径为例: 1.测试页面html & ...
- iOS web view 与 js 交互
移动应用中许多复杂的且经常改动的页面会使用H5进行代替native,这里就会使用到js和webview的交互 iOS里面,UIWebView提供了方法stringByEvaluatingJavaScr ...
随机推荐
- 2022-05-31内部群每日三题-清辉PMP
1.由于项目执行期间的范围变更,项目经理确定供应商必须对一个已在使用的产品模块进行更改.项目经理首先做什么? A.准备一份变更请求,以更新供应商的合同条款 B.检查采购管理计划和合同条款 C.将该信息 ...
- PHP 执行系统命令解压7z格式压缩包
银行推送的账单是7z格式的压缩包,需要用程序对账单进行解压,网上关系PHP解压7z格式压缩包的资料很少 现在分享下处理过程,首先安装7-zip软件,我是在windows环境下调试的,下载地址https ...
- 重写Collections集合的排序比较CompareTo方法
Collections.sort()使用该方法实际是重写Comparator接口的compare方法实现排序: //传入参数list集合,Comparator接口 T:list的元素类型 //如Lis ...
- SSL certificate problem: unable to get local issuer certificate 错误解决
终端报了如下错误git SSL certificate problem: unable to get local issuer certificate 这个问题是由于没有配置信任的服务器HTTPS验证 ...
- WampServer3.0服务器端开启ssl认证后重启Apache失败,解决办法
最近项目中需要访问网站的 https 地址,于是进行部署,什么事情都是想起来简单,做起来难,想着一天就能搞定的事儿,结果前后折腾了三天. 现在把部署的经历记录下来,希望对朋友们有所帮助. 1.在西部数 ...
- 2022-6,flask+vue+uwsgi+nginx,线上部署完整流程打包配置文件
uwsgi配置文件 [uwsgi] # 服务端口号,这里没有设置IP值,默认是加载服务器的IP地址 http = :8000 # flask项目地址 chdir = /home/flask_proje ...
- flutter 常用ui库
1,EasyRefresh实现listview上拉刷新下拉加载,添加头尾布局,以及加载样式 地址:https://pub.flutter-io.cn/packages/flutter_easyrefr ...
- 使用ts二次封装storage(sessionStorage/localStorage)
export class LocalCache { setCache<T = any>(key: string, value: T): boolean; setCache<T = a ...
- 调度器43—migration 内核线程
基于LInux-5.10 相关:Linux内核机制-smp_hotplug_thread:https://www.cnblogs.com/hellokitty2/p/17114737.html 一.相 ...
- golang 实现twitter雪花算法
1 /* 2 * twitter雪花算法golang实现,生成唯一趋势自增id 3 * 保留位:63位 4 * 毫秒时间戳:[62-20]43位,时间范围[1970-01-01 00:00:00.00 ...