前言:开头放个大招---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