一、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方法封装的更多相关文章

  1. iOS OC与JS的交互(JavaScriptCore实现)

    本文包括JS调用OC方法并传值,OC调用JS方法并传值 本来想把html放进服务器里面,然后访问,但是觉得如果html在本地加载更有助于理解,特把html放进项目里 HTML代码 <!DOCTY ...

  2. OC和JS的交互---JavaScriptCore

    JavaScriptCore的简单介绍 JavaScriptCore是iOS7提供的原生框架,可以让Objective-C和JavaScript提供简单直接的交互. JavaScriptCore的使用 ...

  3. OC与JS的交互(iOS与H5混编)

    大神总结WKWebView的坑:https://mp.weixin.qq.com/s/rhYKLIbXOsUJC_n6dt9UfA 在开发过程中,经常会出现需要iOS移动端与H5混编的使用场景. iO ...

  4. [转]OC与JS的交互详解

    事情的起因还是因为项目需求驱动.折腾了两天,由于之前没有UIWebView与JS交互的经历,并且觉得这次在功能上有一定的创造性,特此留下一点文字,方便日后回顾. 我要实现这样一个需求:按照本地的CSS ...

  5. OC与JS的交互详解

    事情的起因还是因为项目需求驱动.折腾了两天,由于之前没有UIWebView与JS交互的经历,并且觉得这次在功能上有一定的创造性,特此留下一点文字,方便日后回顾. 我要实现这样一个需求:按照本地的CSS ...

  6. OC与JS的交互

    现在APP的开发已经不局限于原生开发,很多都是原生+html5这种混合开发 我们可以通过webView这个控件,实现混合开发. 1.首先你需要创建一个html页面 <html> <h ...

  7. cordova ios --->OC 调用 js (一)

    1.在HTML中定义一个函数如OCcallJS() function OCcallJS(){ alert("OC 调用js 的 方法"); } 2.当webview 加载完成的时候 ...

  8. 前端js重组树形结构数据方法封装

    不知道大家平时工作中,有没有遇到这样一种情况:后端接口返回的数据,全都是一维的数组,都是平铺直叙式的数据,业务需求却要你实现树形结构的功能.那么,针对这种情况该怎么办呢?是跟后台好好沟通一下呢,还是沟 ...

  9. js浮点数保留位数方法封装

    大家在平时业务中应该经常跟小数打交道吧,有没有被小数点的保留位数问题搞得头疼啊.比如,保留一位小数,保留俩位小数,保留三位小数,向上取整.四舍五入等等. 而我最近在项目中正好遇到类似的问题:有的地方要 ...

随机推荐

  1. Hive设置参数的三种方法

    Hive提供三种可以改变环境变量的方法,分别是:(1).修改${HIVE_HOME}/conf/hive-site.xml配置文件:(2).命令行参数:(3).在已经进入cli时进行参数声明.下面分别 ...

  2. 如何看一个VC工程具体是什么工程?

    VC6等可以创建MFC, Win32等工程,拿到一个工程,怎么判断是什么工程呢? VC6全文检索看看有没有theApp 如果有一般就是MFC的 (VS?)看看工程设置,入口点函数写的是什么,/subs ...

  3. HTML5 Canvas 画钟表

    画钟表是2D画图的老生常谈,我也不能免俗弄了一个.代码如下: <!DOCTYPE html> <html lang="utf-8"> <meta ht ...

  4. 倍福TwinCAT(贝福Beckhoff)基础教程 松下驱动器如何执行绝对值清零

    点击参数-参数一览,然后修改015为0(设置为绝对编码器方式),点击设定值变更,然后传送,EEP,将参数写入驱动器(保持USB线连接,重启驱动器并确认参数确是改成0了)   监视器-清除多圈数,清除之 ...

  5. python中MySQLdb模块用法实例

    篇文章主要介绍了python中MySQLdb模块用法,以实例形式详细讲述了MySQLdb模块针对MySQL数据库的各种常见操作方法,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了python中 ...

  6. Linux学习笔记 (二)常用linux命令

    一.命令行语法: 命令字 [选项] [参数] 注意:Linux中对命令是区分大小写的. 二.获取命令帮助: 1.help命令:help xxx,shell内部指令,用来获取linux内部命令.例如:h ...

  7. DB2 锁问题分析与解释

    DB2 锁问题分析与解释 DB2 应用中常常会遇到锁超时与死锁现象,那么这样的现象产生的原因是什么呢.本文以试验的形式模拟锁等待.锁超时.死锁现象.并给出这些现象的根本原因. 试验环境: DB2 v9 ...

  8. 快速接入 Android BLE 开发的基础框架

    代码地址如下:http://www.demodashi.com/demo/12092.html ** Android BLE基础操作框架,基于回调,操作简单.包含扫描.多连接.广播包解析.服务读写及通 ...

  9. Jmeter3.0-插件管理

    本文转自推酷:http://www.tuicool.com/articles/UV7fI3V JMeter ,老牌,开源,轻量,Apache基金会的顶级项目,光是这些关键字就足以让大量用户将其纳入自己 ...

  10. APP开发关于缓存

    1 http://www.cnblogs.com/qianxudetianxia/archive/2012/02/20/2112128.html 1.1 http://blog.csdn.net/ln ...