JS和webView的交互
JSContext的交互方式最为简单快捷:
1.申明一个JSContext对象
self.jsRunner = [[JSContext alloc] init];
2.在原生中定义申明一个JS函数方法(JS代码函数中可以使用)
self.jsRunner[@"action1"] = ^(int value){
printf("啦啦啦\n");
};
self.jsRunner[@"action2"] = ^(JSValue *value){
NSLog(@"%@",value);
};
3.通过执行JS代码的方式执行自己定义的函数(热更新通过加载自定义好的JS函数专门来转移实现原生消息发送相关函数,而后通过下载JS文件然后执行预定的代码尝试或达到替代原生代码过程)
[self.jsRunner evaluateScript:@"action1(10);"];
[self.jsRunner evaluateScript:@"action2([1,2,3,\'你好哦\']);function testAction(){return 99;};"];
JSValue *result = [self.jsRunner evaluateScript:@"testAction();"];
NSLog(@"返回的结果:%@",result);
在UIWebView中获得JSContext,在代理OnFinshload函数中通过
self.jsRunner =[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
获得
在WKWebView中
You cannot obtain the context, because layout and javascript is handled on another process. Instead, add scripts to your webview configuration, and set your view controller (or another object) as the script message handler. - (void)setupWKWebView
{
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
// 设置偏好设置
config.preferences = [[WKPreferences alloc] init];
// 默认为0
config.preferences.minimumFontSize = ;
// 默认认为YES
config.preferences.javaScriptEnabled = YES;
// 在iOS上默认为NO,表示不能自动通过窗口打开
config.preferences.javaScriptCanOpenWindowsAutomatically = NO;
config.processPool = [[WKProcessPool alloc] init];
config.userContentController = [[WKUserContentController alloc] init];
//注意在这里注入JS对象名称 "JSObjec"
[config.userContentController addScriptMessageHandler:self name:@"JSObjec"]; self.showWebView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:config];
self.showWebView.navigationDelegate = self;
[self.view addSubview:self.showWebView]; NSURL *path = [NSURL fileURLWithPath:网页文件路径];
[self.showWebView loadRequest:[NSURLRequest requestWithURL:path]];
} Now, send messages from JavaScript like so: //在JS函数代码中调用
//这里的内容差不多全部一样 只是调用的方法有区别 一定要注意区分
//这个是用UIWebView时调用的方法 JSObjec.getCall(callInfo);
//下面是用WKWebView调用的方法
window.webkit.messageHandlers.JSObjec.postMessage(callInfo);
//当执行到上述语句是将回调下面这个函数
Your script message handler will receive a callback: - (void)userContentController:(WKUserContentController *)userContentController
didReceiveScriptMessage:(WKScriptMessage *)message
{
NSLog(@"%@", message.body);
//此处body可以放回调给WebView的js端回调函数名称参数个数类型描述等内容,通过调用执行该JS函数将操作结果返回给Web端
}
普通的实现方式:
通过WebView调用页面中的JS函数,获得返回值
通过代理链接截获,执行原生代码
JS和webView的交互的更多相关文章
- js与webview 常用交互代码
常用js交互 css常用参数::: 是否允许用户选择元素的内容,选择值包括: auto:用户可以选择元素内的内容 none:用户不能选择任何内容 text:用户只能选择元素内的 ...
- WebView与JS的几种交互
http://www.jianshu.com/p/0042d8eb67c0 最近整理了一下原生与H5之间的交互方式,简单的做个总结.OC端与JS的交互,大致有这几种:拦截协议.JavaScriptCo ...
- (转载)JS与WebView交互存在的一些问题
JS与WebView交互存在的一些问题 作者 隔壁的李小宝 关注 2015.06.09 19:30 字数 2896 阅读 11117评论 3喜欢 35 一.背景概述 2013年Android平台暴露出 ...
- Android混合开发之WebViewJavascriptBridge实现JS与java安全交互
前言: 为了加快开发效率,目前公司一些功能使用H5开发,这里难免会用到Js与Java函数互相调用的问题,这个Android是提供了原生支持的,不过存在安全隐患,今天我们来学习一种安全方式来满足Js与j ...
- iOS中JS 与OC的交互(JavaScriptCore.framework)
iOS中实现js与oc的交互,目前网上也有不少流行的开源解决方案: 如:react native 当然一些轻量级的任务使用系统提供的UIWebView 以及JavaScriptCore.framewo ...
- iOS开发:JavaScriptCore.framework的简单使用--JS与OC的交互篇
iOS7之后苹果为众猿推出了JavaScriptCore.framework这个框架,这个框架为大家在与JS交互上提供了很大帮助,可以在html界面上调用OC方法并传参,也可以在OC上调用JS方法并传 ...
- js 与 ios Android交互
一.android 交互 1.js调用webview 在android API Level 17及以上的版本中,就会出现js调用不了android的代码,这是版本兼容的问题,需要在调用的方法上面加一个 ...
- iOS中js与objective-c的交互(转)
因为在iOS中没有WebKit.Framework这个库的,所以也就没有 windowScriptObject对象方法了.要是有这个的方法的话 就方便多了,(ps:MacOS中有貌似) 现在我们利用其 ...
- 与webView进行交互,webView小记
本文转载至 http://www.verydemo.com/demo_c101_i46895.html 一.与webView进行交互,调用web页面中的需要传参的函数时,参数需要带单引号,或者双引号( ...
随机推荐
- 5 -- Hibernate的基本用法 --4 2 hibernate.properties文件与hibernate.cfg.xml文件
hibernate.properties : project\etc\hibernate.properties hibernate.cfg.xml : project\etc\hibernate.cf ...
- HDOJ 4276 The Ghost Blows Light(树形DP)
Problem Description My name is Hu Bayi, robing an ancient tomb in Tibet. The tomb consists of N room ...
- Maven发布war包到Tomcat
一.修改Tomcat下配置文件tomcat-users.xml,然后启动 <role rolename="manager-gui"/> <role rolenam ...
- iOS开发--关闭ARC
对整个项目关闭ARC project -> Build settings -> Apple LLVM complier 3.0 - Language -> objective-C A ...
- std::string与std::wstring互相转换
作者:zzandyc来源:CSDN原文:https ://blog.csdn.net/zzandyc/article/details/77540056 版权声明:本文为博主原创文章,转载请附上博文链接 ...
- CentOS配制FTP服务器,并且能用root权限登录
步骤如下: 1.运行yum install vsftpd命令 具体的细节如下:(如果无法更新,你先配置能访问互联网,我有文档叫 CentOS 在 VMware下,如何联网到Internet的解决办法可 ...
- 《C++ Primer Plus》第17章 输入、输出和文件 学习笔记
流是进出程序的字节流.缓冲区是内存中的临时存储区域,是程序与文件或其他I/O设备之间的桥梁.信息在缓冲区和文件之间传输时,将使用设备(如磁盘驱动器)处理效率最高的尺寸以大块数据的方式进行传输.信息在缓 ...
- open-falcon之HBS
功能 处理agent心跳请求,并将agent信息(ip.hostname.agent_version.plugin_version)等信息入库(portal库) 为agent提供执行run api的白 ...
- Git学习(二)(2015年11月18日)(2016年1月29日)
2015年11月18日Git学习: .Shell 删除文件夹及其所有文件 rd/s/q 文件目录 ---------------当前为先创建本地Git库后与网上Git服务器关联------------ ...
- 【node.js】Error: CERT_UNTRUSTED
背景 : 在linux centos7 上 进行npm 命令是报错: Error: CERT_UNTRUSTED 解决办法: 关掉HTTPS就好了 npm config set strict-ssl ...