OC和JS交互的三种方法
看简书上说一共有六种OC和JS交互的方法,但是前三种原理都一致,都是通过检测、拦截Url地址实现互相调用的。剩下的react native等第三方框架原理不一样,也没有去研究,下边记录我使用的三种方法(原理都是拦截Url地址)。
(一)、使用系统自带JavaScriptCore库进行交互,支持iOS7以后系统。(备注:我这个项目在交互MBProgress的时候控制隐藏,js代码会发生奔溃,安卓是好的,原因始终找不到)
oc调用js方法
[homeWebView stringByEvaluatingJavaScriptFromString:jsFunction];
-------------------------------------------------------------------
js调用oc方法导入
1、JavaScriptCore库
#import <JavaScriptCore/JavaScriptCore.h>
2、获得上下文
- (void)webViewDidFinishLoad:(UIWebView *)webView{
//降低webview带来的内存泄露
[[NSUserDefaultsstandardUserDefaults] setInteger:0forKey:@"WebKitCacheModelPreferenceKey"];
//----------------------JS回掉方法----------------------------------------
JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//没有返回值的写法
context[@"showProgressDialogPhone"] = ^() { // 显示
[self showProgressDialog];
};
// 有返回值的写法,
context[@"getTabInfoIOS"] = [self getTabInfoIOS];//获得权限
}
3、js端绑定方法oc方法,绑定的这个方法名称必须要和oc里注册的方法名称保持一致
function showProgressDialog(){
showProgressDialogPhone();
}
(二)、实现了JSExport协议的协议,这样调用到vc里的方法
1、声明协议,实现协议方法
在.h文件中声明
@protocol TestJSObjectProtocol <JSExport>
-(void)closeProgressDialog;
@end
.m文件中实现协议方法
@interface ViewController ()<TestJSObjectProtocol>
@end
1、同上先获得上下文,oc这里绑定方法、实现closeProgressDialog方法
ViewController *viewCtlOBJ = [ViewController new];
context[@"viewCtlOBJ"] = viewCtlOBJ;
NSString *jsStr1=[NSString stringWithFormat:@"viewCtlOBJ.closeProgressDialog()"];
[context evaluateScript:jsStr1];
2、js这边调用oc方法
function closeProgressDialog(){
viewCtlOBJ.closeProgressDialog();
}
(三)、使用WebViewJavascriptBridge进行oc和js的交互
备注:兼容iOS7以下版本,我最终使用的这个方法,解决掉js代码崩溃的问题。这个类库是异步执行的,优点:调用oc和js代码优雅,传值和回调方便
1、先导入WebViewJavascriptBridge包,可参考上一篇文章导入。
#import "WebViewJavascriptBridge.h"
@propertyWebViewJavascriptBridge* bridge;
2、OC原生注册方法,实现方法
[WebViewJavascriptBridgeenableLogging];
_bridge = [WebViewJavascriptBridgebridgeForWebView:homeWebView];
[_bridgesetWebViewDelegate:self];
/***
/js调用oc
/@param registerHandler 要注册的事件名称(这里我们为showProgressDialogPhone)
/@param handel 回调block函数 当后台触发这个事件的时候会执行block里面的代码
***/
[_bridgeregisterHandler:@"showProgressDialogPhone"handler:^(id data, WVJBResponseCallback responseCallback) {
NSLog(@"显示加载");
[self showProgressDialog];
responseCallback(@"Response 显示加载");
}];
3、js端调用注册的方法
//固定写法
function setupWebViewJavascriptBridge(callback) {
if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
window.WVJBCallbacks = [callback];
var WVJBIframe = document.createElement('iframe');
WVJBIframe.style.display = 'none';
WVJBIframe.src = 'https://__bridge_loaded__';
document.documentElement.appendChild(WVJBIframe);
setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
}
setupWebViewJavascriptBridge(function(bridge) {
bridge.callHandler('showProgressDialogPhone', function(response) {
alert(response);
})
});
-----------------------------------------------------------------------------------------
//oc调用js代码
bridge.registerHandler('testJavascriptHandler', function(data, responseCallback) {
log('ObjC called testJavascriptHandler with', data)
var responseData = { 'Javascript Says':'Right back atcha!' }
responseCallback(responseData)
})
//需要传参数,不需要从后台返回执行结果
/***
@param callHandler 商定的事件名称,用来调用网页里面相应的事件实现
@param data id类型,相当于我们函数中的参数,向网页传递函数执行需要的参数
***/
// [_bridge callHandler:@"testJavascriptHandler" data:@{ @"foo":@"before ready" }];
--------------------------------------------------------------------------------------
OC和JS交互的三种方法的更多相关文章
- js 与ios 交互的三种方法
第一种:IOS拦截url 实现跳转 参考链接:http://www.cnblogs.com/pengyingh/articles/2354381.html IOS9.0 及以上支持 第二种:IOS ...
- 判断点击第几个按钮JS代码的三种方法
方法一:使用下标实现<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...
- js创建对象的三种方法:文本标识法和构造器函数法和返回对象的函数
文本标识法和定义变量差不多,像这样 var obj = {name:'HanMM','2':'Dali'}; 函数构造器法 先创建一个对象函数 function Obj() { this.addre ...
- asp.net后台向前端输出js脚本的三种方法
//这个方法最快,因为它会输出到html标签之前 Response.Write("<script type='text/javascript'>alert('这个最快')< ...
- js深度复制三种方法
1.用递归的方式进行深度复制 2.用JSON.stringify加上JSON.parse()进行深度复制 3.用jquery中自带的方法$.extend()进行深度复制 具体实现代码可百度自行查询
- js创建对象的三种方法
1.使用对象初始化器:{} var person = {....} 2 var person=new object() function person(参数) { this.参数=... } var ...
- 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理
服务器文档下载zip格式 刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...
- (转)在网页中JS函数自动执行常用三种方法
原文:http://blog.sina.com.cn/s/blog_6f6b4c3c0100nxx8.html 在网页中JS函数自动执行常用三种方法 在网页中JS函数自动执行常用三种方法 在HTML中 ...
- JS模拟实现封装的三种方法
前 言 继承是使用一个子类继承另一个父类,那么子类可以自动拥有父类中的所有属性和方法,这个过程叫做继承! JS中有很多实现继承的方法,今天我给大家介绍其中的三种吧. 1.在 Object类上 ...
随机推荐
- strstr()函数实现
/* 函数要求:写一个函数模拟strstr()函数,设计中不得使用其他库函数. 函数原型:const char *strstr(const char *str1,const char *str2); ...
- Caused by: java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be ope
1.错误描述 java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.tes ...
- Unhandled event loop exception No more handles
1.错误描述 2.错误原因 3.解决办法
- vue全局配置----小白基础篇
今天学习vue全局配置.希望帮助我们去了解vue的全局配置,快速开发. Vue.config是vue的全局配置对象.包含Vue的所有全局属性: silent:boolean(默认值:false)--- ...
- 使用jQuery的一些建议
1.尽可能使用id选择器而不是类选择器 例如: //html <p id="chooseId">测试文本</p> //jQuery console.time ...
- Python与Memcached交互
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached ...
- 【原】storm组件(架构层面)
Strom集群遵循从主模式,主与从之间通过Zookeeper协作.架构层面上包括三个组件: 1) Nimbus Node 2)Supervisor Nodes 3)Zookeeper 其中Nimbus ...
- 简要分析javascript的选项卡和轮播图
选项卡 思路 1.按钮和展示的页面要对应:分别遍历,记住当前按钮的索引,让其成为展示页面的索引 2.只出现所对应的页面:所有的页面隐藏,只展示想要的页面 只展示js代码 for(var i=0;i&l ...
- Spring Boot Actutaur + Telegraf + InFluxDB + Grafana 构建监控平台
完成一套精准,漂亮图形化监控系统从这里开始第一步 Telegraf是收集和报告指标和数据的代理 它是TICK堆栈的一部分,是一个用于收集和报告指标的插件驱动的服务器代理.Telegraf拥有插件或集成 ...
- android小程序之幸运菜谱
android小程序之幸运菜谱 前言:刚刚结束短短5天的android公开课程,收获不少,写下来记录一下吧!(因为学校校企公开课的缘故才偶然接触的android,所以只学了这几天,不喜勿喷) 一开始得 ...