iOS 基于javascriptcore封装的 webviewjavascritpbridge

2 篇文章 0 订阅

1.javascriptcore介绍

webkit的组成部分,对js进行解析和提供执行环境。苹果在ios7后推出的oc和javascript互相调用的开源库。
以前ios调用oc 用stringByEvaluatingJavaScriptFromString
JS调用oc,是基于url进行拦截 代表开源库:webviewjavascriptbridge
使用javascriptcore 能够提高oc和js的响应速度,提高性能。

2.javascriptcore 用法

JSContext
一个JSContext 实例代表着一个js运行时环境,js代码都需要在一个context上执行,jscontext负责管理js虚拟机中所有对象的生命周期。

JSValue 代表javascript 原始类型 函数 ,操作javavalue操作javascript ,每个javavalue强引用一个context

JSVirtualMachine
js代码运行的虚拟机,提供javascriptcore执行需要的资源,有自己独立的堆栈,和垃圾回收方式,线程安全,创建不同的jsvirtualmachine虚拟机对象,不同的虚拟机可以并发执行js代码。

objects 调用 js

加载javascript代码
context解析javascript
获取对象和调用方法

var appendString = function(name) {
      return 'string:' + name;
  };
  var arr = [1, 2 , 'hello world'];

  //test.m
  NSString *jsPath = [[NSBundle mainBundle] pathForResource:@"test"ofType:@"js"];
  NSString *jsContent = [NSString stringWithContentsOfFile:jsPath encoding:NSUTF8StringEncoding error:nil];

  JSContext *context = [[JSContext alloc] init];
  [context evaluateScript:jsContent];

  JSValue *value = [context[@"appendString"] callWithArguments:@[@"hello"]];
  JSValue *value1 = context[@"arr"];

  NSLog(@"appendString:%@",[value toString] );//appendString:string:hello
  NSLog(@"arr:%@",[value1 toArray] );

JS调用oc方法

第一个是Block

 JSContext *context = [[JSContext alloc] init];
    context[@"sayhi"] = ^(NSString *name) {
        NSLog(@"say hi to %@",name);
    };
    [context evaluateScript:@"sayhi('Greg')"]; 

第二个是 实现JSExport协议
//定义需要暴露给js的内容,这里我们只暴露personName和queryPersonName接口

@protocol PersonProtocol <JSExport>
@property(nonatomic,copy)NSString *personName;
-(NSString *)queryPersonName;
@end

//Person实现PersonProtocol协议,而自己定义的age和queryPersonAge接口不暴露给js
@interface Person : NSObject <PersonProtocol>
@property(nonatomic,assign)NSInteger age;
-(NSInteger)queryPersonAge;
@end

@implementation Person
@synthesize personName = _personName;

-(NSString *)queryPersonName{
    return self.personName;
}
-(NSInteger)queryPersonAge{
    return self.age;
}
@end

JSContext *context = [[JSContext alloc] init];

//创建Person类的对象,将他赋值给js对象
Person *person=[Person new];
person.personName = @"Greg";
person.age = 27;
context[@"person"]=person;

//可以调用获取PersonProtocol暴露的内容
NSString *personName = [[context evaluateScript:@"person.personName"] toString]; //"Greg"
NSString *personName1 = [[context evaluateScript:@"person.queryPersonName()"] toString]; //"Greg"

//js无法调用跟age相关的内容
NSInteger age = [[context evaluateScript:@"person.age"] toInt32]; // 0
NSInteger age1 = [[context evaluateScript:@"person.queryPersonAge()"] toInt32]; /

3.封装

将javascriptcore进行封装,更方便ios 和 前端进行数据的交互和方法的调用,使用方式和webviewjavascriptbridge一样,先在plist文件配置,对外暴露的oc接口需要实现指定的协议。
demo:https://github.com/HZQuan/WebViewJavaScriptCoreBridge

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值