美文网首页
JSCore (一) JS调用OC

JSCore (一) JS调用OC

作者: Baby小猪 | 来源:发表于2017-01-13 18:00 被阅读118次

    刚开发完成的项目是H5和OC混合开发的,一直没有机会整理,因为公司项目中用到的混编方式不常见,以后有空我在整理。今天我主要是总结一下JSCore的简单使用。

    • 首先,简单介绍一下JavaScriptCore里面的几个类
    类型 介绍
    JSContext 就为其提供着运行环境,通过- (JSValue *)evaluateScript:(NSString *)script;方法就可以执行一段JavaScript脚本,并且如果其中有方
    JSValue 是JavaScript和Object-C之间互换的桥梁,它提供了多种方法可以方便地把JavaScript数据类型转换成Objective-C,或者是转换过去
    JSManagedValue 是用来包装一个 JSValue 对象的,JSManagedValue 对象通过添加“有条件的持有(conditional retain)”行为来实现自动内存管理。一个managed value 的基本用法就是用来在一个要导出(exported)到 JavaScript 的 Objective-C 或者 Swift 对象中存储一个 JavaScript 值
    JSVirtualMachine 为JavaScript的运行提供了底层资源. JSContext的创建都是基于JSVirtualMachine:- (id)initWithVirtualMachine:(JSVirtualMachine *)virtualMachine;,如果是使用- (id)init;进行初始化,那么在其内部会自动创建一个新的JSVirtualMachine对象然后调用前边的初始化方法.
    JSExport 作为两种语言的互通协议,所有继承了这个协议的协议中定义的方法都可以在JSContext中被使用。
    • 下面来看具体的方法
    1. JS里面直接调用(Block)
    2. JS里面通过对象调用(JSExport)
      情景假设:

    JS有一方法:getMainHexColor()用来设置Web导航条的颜色。
    我们需要在OC方法里面去设置Web导航条的颜色。

    方法一:

     //首先创建JSContext 对象
    JSContext * context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    
    context[@"getMainHexColor"] = (NSString *)^(NSString * str){
            NSLog(@"-------str");
            return str;
        };
    NSString * jsFuc = @"getMainHexColor('#90d23d')";
    [context evaluateScript:jsFuc];
    

    方法二:

    //定义一个遵守JSExport协议的协议
    @protocol GPJSInvokeOCDelegate <JSExport>
    
    - (NSString *)getMainHexColor:(NSString *)HexColor; //获取主色调
    
    @end
    
    #import "GPJSObjectModel.h"
    // 此模型用于注入JS的模型,这样就可以通过模型来调用方法
    @interface GPJSObjectModel ()<GPJSInvokeOCDelegate>
    
    @end
    
    @implementation GPJSObjectModel
    
    - (NSString *)getMainHexColor:(NSString *)HexColor{
        NSString * colorStr =HexColor;
        if (colorStr) {
            return colorStr;
        }
        return @"";
    }
    @end
    
    //    给JS注入模型
        GPJSObjectModel * model = [[GPJSObjectModel alloc] init];
        context[@"OCObject"] = model;
        NSString *jsStr1=@"OCObject.getMainHexColor('#90d23d')";
        [context evaluateScript:jsStr1];
    
    • 其他
    //获取参数列表
    NSArray * args = [JSContext currentArguments];
    
    //当前调用该方法的对象
    JSValue * this = [JSContext currentThis];
    
    // 打印异常
    context.exceptionHandler =^(JSContext *context, JSValue *exceptionValue){
        context.exception = exceptionValue;
        NSLog(@"%@", exceptionValue);
        };
    

    相关文章

      网友评论

          本文标题:JSCore (一) JS调用OC

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