iOS OC和JS的交互 javaScriptCore方法封装
一、javaScriptCore
javaScriptCore是一种JavaScript引擎,主要为webKit提供脚本处理能力,javaScriptCore是开源webkit的一部分,他提供了强大的整合能力.下面以JS调用OC方法为例,OC调用JS为例说明.
- JSContext, JSContext是代表JS的执行环境,通过-evaluateScript:方法就可以执行一JS代码
- JSValue, JSValue封装了JS与ObjC中的对应的类型,以及调用JS的API等
- JSExport, JSExport是一个协议,遵守此协议,就可以定义我们自己的协议,在协议中声明的API都会在JS中暴露出来,才能调用
二、封装源码
注:JSExport 也可实现JS调用OC方法,但是个人感觉过于复杂,不如直接调用直接
还可以使用WebViewJavascriptBridge第三方库去实现,具体的实现方式根据和后台人员商量决定
根据实用性需求,封装出三个方法,一个初始化(要在UIWebview加载完成方法中创建) 一个JS调用OC的方法(id为JS传给OC的参数,id类型为JSValue数组) 一个是OC调用JS的方法(id为OC传递给JS的参数,类型根据需求定义)
// 初始化
+ (instancetype)bridgeForWebView:(UIWebView *)webView;
// JS调OC
- (void)registerHandler:(NSString *)objcName handler:(JSHandler)handler;
// OC调JS
- (void)callHandler:(NSString*)jsName data:(id)data;
/***********************************WebViewJavascriptBridge.h**********************************/
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <JavaScriptCore/JavaScriptCore.h>
@protocol WebViewJavascriptBridgeProtocol <JSExport>
// 通过JS调用OC方法 (采用代理的方法)
- (void)CallOCFunction;
- (void)CallOCFunctionFirstParameter:(NSString *)parameter;
@end
typedef void(^JSResponseCallback)(id responseData);
typedef void(^JSHandler)(id data);
@interface WebViewJavascriptBridge : NSObject <WebViewJavascriptBridgeProtocol>
// 初始化
+ (instancetype)bridgeForWebView:(UIWebView *)webView;
// JS调OC
- (void)registerHandler:(NSString *)objcName handler:(JSHandler)handler;
// OC调JS
- (void)callHandler:(NSString*)jsName data:(id)data;
@end
/***********************************WebViewJavascriptBridge.m**********************************/
#import "WebViewJavascriptBridge.h"
@interface WebViewJavascriptBridge ()
{
JSContext *_jsContext;
UIWebView *_webView;
}
@end
@implementation WebViewJavascriptBridge
static WebViewJavascriptBridge * gThis = nil;
+ (WebViewJavascriptBridge *) instance
{
if ( gThis == nil ){
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
gThis = [[WebViewJavascriptBridge alloc] init];
});
}
return gThis;
}
+ (instancetype)bridgeForWebView:(UIWebView *)webView {
WebViewJavascriptBridge *bridge = [self instance];
[bridge platformSpecificSetup:webView];
return bridge;
}
- (void)platformSpecificSetup:(UIWebView *)webView {
_webView = webView;
// 对JSContext对象进行初始化
_jsContext = [_webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
// 验证JSContext对象是否初始化成功
_jsContext.exceptionHandler = ^(JSContext *context, JSValue *exception) {
context.exception = exception;
NSLog(@"异常信息:%@", exception);
};
}
#pragma mark - public
// objcName : oc函数名
// handler : block回调
- (void)registerHandler:(NSString *)objcName handler:(JSHandler)handler {
// 创建objcEcho对象赋值给js对象self
// _jsContext[objcName] = self;
// JS调用OC函数
_jsContext[objcName] = ^() {
// 获取JS传来的参数 (JSValue对象数组)
NSArray *args = [JSContext currentArguments];
// 回调
handler(args);
};
}
// jsName : js函数名
// data : 传给js的参数
// responseCallback 回调
- (void)callHandler:(NSString*)jsName data:(id)data {
// OC调用JS函数
JSValue *jsValue = _jsContext[jsName];
// 传字典
// NSDictionary *dict = @{@"key1" : @"参数1", @"key2" : @"参数2"};
// 传对象
// Person *person = [[Person alloc] init];
// JSValue *value = [JSValue valueWithObject:person inContext:_jsContext];
// [value setValue:@"朱凯巍" forProperty:@"name"];
// [value setValue:@(10) forProperty:@"age"];
// OC为JS传参数
[jsValue callWithArguments:@[data]];
}
#pragma mark - JSWebViewObjectProtocol
// 通过JS调用OC方法
- (void)CallOCFunction {
NSLog(@"%s",__func__);
}
- (void)CallOCFunctionFirstParameter:(NSString *)parameter {
NSLog(@"%s",__func__);
}
iOS OC和JS的交互 javaScriptCore方法封装的更多相关文章
- iOS OC与JS的交互(JavaScriptCore实现)
本文包括JS调用OC方法并传值,OC调用JS方法并传值 本来想把html放进服务器里面,然后访问,但是觉得如果html在本地加载更有助于理解,特把html放进项目里 HTML代码 <!DOCTY ...
- OC和JS的交互---JavaScriptCore
JavaScriptCore的简单介绍 JavaScriptCore是iOS7提供的原生框架,可以让Objective-C和JavaScript提供简单直接的交互. JavaScriptCore的使用 ...
- OC与JS的交互(iOS与H5混编)
大神总结WKWebView的坑:https://mp.weixin.qq.com/s/rhYKLIbXOsUJC_n6dt9UfA 在开发过程中,经常会出现需要iOS移动端与H5混编的使用场景. iO ...
- [转]OC与JS的交互详解
事情的起因还是因为项目需求驱动.折腾了两天,由于之前没有UIWebView与JS交互的经历,并且觉得这次在功能上有一定的创造性,特此留下一点文字,方便日后回顾. 我要实现这样一个需求:按照本地的CSS ...
- OC与JS的交互详解
事情的起因还是因为项目需求驱动.折腾了两天,由于之前没有UIWebView与JS交互的经历,并且觉得这次在功能上有一定的创造性,特此留下一点文字,方便日后回顾. 我要实现这样一个需求:按照本地的CSS ...
- OC与JS的交互
现在APP的开发已经不局限于原生开发,很多都是原生+html5这种混合开发 我们可以通过webView这个控件,实现混合开发. 1.首先你需要创建一个html页面 <html> <h ...
- cordova ios --->OC 调用 js (一)
1.在HTML中定义一个函数如OCcallJS() function OCcallJS(){ alert("OC 调用js 的 方法"); } 2.当webview 加载完成的时候 ...
- 前端js重组树形结构数据方法封装
不知道大家平时工作中,有没有遇到这样一种情况:后端接口返回的数据,全都是一维的数组,都是平铺直叙式的数据,业务需求却要你实现树形结构的功能.那么,针对这种情况该怎么办呢?是跟后台好好沟通一下呢,还是沟 ...
- js浮点数保留位数方法封装
大家在平时业务中应该经常跟小数打交道吧,有没有被小数点的保留位数问题搞得头疼啊.比如,保留一位小数,保留俩位小数,保留三位小数,向上取整.四舍五入等等. 而我最近在项目中正好遇到类似的问题:有的地方要 ...
随机推荐
- 从头认识java-14.4 Java提供的数组的有用功能(2)
接着上一章节,我们继续介绍Java提供的数组的有用功能. 3.元素的对照Comparator package com.ray.ch14; import java.util.Arrays; import ...
- 性能测试篇 :Jmeter监控服务器性能
转载:http://www.cnblogs.com/chengtch/p/6079262.html jmeter也可以像loadrunner一样监控服务器CPU.内存等性能参数,不过需要安装一些插件 ...
- 页面加载后累加,自加1&&判断数字是否为两位数
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- MySQL架构组成之物理文件组成
一.日志文件 1.错误日志:Error Log 内容:MyQL Server 执行过程中全部较为严重的警告和错误信息,以及MySQL Server 每次启动和关闭的具体信息. 路径:默认存放位置在 ...
- C# Socket.Connect连接请求超时机制
介绍 您可能注意到了,.Net的System.Net.Sockets.TcpClient和System.Net.Sockets.Socket都没有直接为Connect/BeginConnect提供超时 ...
- Java Swing界面编程(21)---事件处理:窗口事件
WindowLIstener是专门处理窗口的事件监听窗口.一个窗口的全部变化.如窗口的打开.关闭等都能够使用这个接口进行监听. 实现WIndowListener: package com.beyole ...
- JUnit单元测试中的setUpBeforeClass()、tearDownAfterClass()、setUp()、tearDown()方法小结
编写JUnit单元测试的时候,会用到 setUpBeforeClass().tearDownAfterClass().setUp().tearDown()这四个方法,例如用 eclipse新建一个ju ...
- [[NSBundle mainBundle] pathForResource:@"name" ofType:@"type"] 找不到对应的文件解决方法
最近在使用[[NSBundle mainBundle] pathForResource:@"name" ofType:@"type"]时,找不到其对应的文件,文 ...
- 使用UIDatePicker
什么是UIDatePicker 用官方文档的话来说,UIDatePicker就是使用多个滚轮来选择日期和时间的类.官方的示例有定时器,闹钟(设置时间)部件.正确设置后,UIDatePicker对象会在 ...
- hdu 1598 find the most comfortable road(并查集)
题意:略 分析:多询问问题,利用并查集加速.类似于kruskal对MST的构建:枚举最小的边,逐渐将更大的边加入集合,当查询的点在同一个集合,那么当前最小值,就是所加的最后一条边与第一条只差. 注意: ...