美文网首页iOS开发讨论会iOS点点滴滴
OC和JS交互基础(JavaScriptCore的使用)

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

作者: wxzhi | 来源:发表于2017-11-27 17:52 被阅读10次

    前言:开头放个大招---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来获取,要不然会循环引用导致被造成内存泄漏。

    相关文章

      网友评论

        本文标题:OC和JS交互基础(JavaScriptCore的使用)

        本文链接:https://www.haomeiwen.com/subject/gwkdbxtx.html