iOS开发讨论会iOS点点滴滴

OC和JS交互基础(JavaScriptCore的使用)

2017-11-27  本文已影响10人  wxzhi

前言:开头放个大招---WXJsInteraction-iOS
demo中详细使用下方介绍的基础属性方法

API基础讲解

加入JavaScriptCore.framework框架

#import <JavaScriptCore/JavaScriptCore.h>

查看文档的时候,可以看到有四个类,一个协议是给开发者作基本操作的


文档截图
1.JSContext给JavaScript提供运行环境,可以让JS和OC或Swift访问对方的对象和方法或函数(基于哈希表--键值对的方式),例:
//初始化:我比较常用的初始化比较粗暴,可以在webView通过kvc直接获取相应的上下文环境(已存在)
self.jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//正常初始化,基于JSVirtualMachine创建(new)
- (instancetype)init;
- (instancetype)initWithVirtualMachine:(JSVirtualMachine *)virtualMachine;
//获取异常信息
self.jsContext.exceptionHandler = ^(JSContext *context, JSValue *exception) {
    context.exception = exception;
    NSLog(@"%@", exception);
};
//运行js代码
[self.jsContext evaluateScript:jsStr];
//方法或block获取context
+ (JSContext *)currentContext;
//方法或block获取执行对象
+ (JSValue *)currentThis;
2.JSVirtualMachine给JavaScript提供了运行资源,可以说JSContext的创建都是在JSVirtualMachine之下建立的。
3.JSValue封装了JavaScript转换代码,可以使用JSValue来转换JavaScript和objective-objective之间的对象、属性、方法和函数,根据官方文档制了个对应表:
OC或Swift类型 JS类型 转换方法
nil undefined
NSNull null
NSString
(Swift String)
String toString
NSNumber和底层numeric类型 Number(value为基础类型)
Boolean
toBool
toDouble
toInt32
toUInt32
NSDictionary (Swift Dictionary) Object toDictionary
NSArray (Swift Array) Array toArray
NSDate date toDate
NSObject Object toObject
toObjectOfClass
block Function
frame frame toPoint
toRange
toRect
toSize

例子:

JSValue *intValue = [self.jsContext evaluateScript:@"2"];
int a = [intValue toInt32];
NSLog(@"intValue: %@, a: %d", intValue, a);
4.JSManagedValue可以对JSValue进行内存管理,如果添加到JSVirtualMachine中,对象就算被交叉访问都能够获取正确对象
5.JSExport为OC和JavaScriptCore之间搭建了一个互通桥梁。例子:
//添加协议
@protocol testJSExport <JSExport>
//为方法添加别名
JSExportAs(testMethodOne, - (void)testMethod1);
- (void)testMethod2;
@end
//接受协议
@interface ViewController : UIViewController<testJSExport>
@end
API基础介绍就到这里了,上述讲到的具体要到demo中看。
这里特别的要强调一下在block和js方法回调中不要直接使用之前创建的JSContext对象或者JSValue对象,要通过传参到block或者通过上面讲到的JSContext的currentContext来获取,要不然会循环引用导致被造成内存泄漏。
上一篇下一篇

猜你喜欢

热点阅读