##使用JS和OC交互(JavaScriptCore) 一

使用JS和OC交互(JavaScriptCore)

JavaScriptCore定义

JavaScriptCore.framework :iOS7 中新加入的框架,用来处理JavaScript。JavaScriptCore 是苹果 Safari 浏览器的 JavaScript 引擎,JavaScriptCor在 OS X 平台上很早就存在的,而在 iOS 平台,直到IOS7才对外开放,并提供了 Objective-C 的接口。

相关类

JSContext:

一个Contet就是一个JS的执行环境,也叫作用域.每个JsValue都和JSContext关联的,并且强引用context.

JSValue:

JS对象在JSVirtualMachine中的一个强引用,其实就是Hybird对象.OC和JS对象之间的转化也是通过JSValue

JSManagedValue:

JS和OC对象的内存管理辅助对象。由于JS内存管理是垃圾回收,并且JS中的对象都是强引用,而OC是引用计数。如果双方相互引用,势必会造成循环引用,而导致内存泄露。我们可以用JSManagedValue保存JSValue来避免。

JSVirtualMachine:

JS运行的虚拟机,有独立的堆空间和垃圾回收机制。

JSExport

一个协议,如果JS对象想直接调用OC对象里面的方法和属性,那么这个OC对象只要实现这个JSExport协议就可以了。

实现

使用OC来调用JS的方法

1.js部分

//求一个数的阶乘
var factorial = function(n){

    if( n < 0){

        return;
    }

    if(n === 1){

        return 1;

    }

    return n * factorial(n-1);

}

2.OC部分

- (void)factorial:(NSNumber *)n{

    
    NSString *jsPath =[[NSBundle mainBundle] pathForResource:@"main" ofType:@"js"];
    NSString *jsStr =[NSString stringWithContentsOfFile:jsPath encoding:NSUTF8StringEncoding error:nil];
    //初始化Js环境
    JSContext *context = [[JSContext alloc]init];
    [context evaluateScript:jsStr];
    //获取JS方法
    JSValue *function = context[@"factorial"];
    //运行方法传递参数
    JSValue *result = [function callWithArguments:@[n]];
    NSLog(@"result:%d",[result toInt32]);
    

}

在WebView中的使用

一: 使用JSExport实现OC和JS的交互

1.html代码部分:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
</head>
<body>
<h1>JavaScriptCore</h1>

<div>
    <!-- 创建一个分享的按钮 --!>
    <input type="button" value="share" onclick="JSShare()">
</div>

<script>

    function JSShare() {
 
        <!--  创建分享数据 --!>
        var shareContent = JSON.stringify({"title": "JavaScriptCore", "desc": "使用JSExport协议进行交互", "shareUrl": "www.cjzkw.cn"});
         alert(shareContent);
         
         <!-- ricky就是相当于桥梁,链接oc和js--!>
         ricky.share(shareContent);
    }


 <!--  使用oc调用js方法 --!>
    function showAlert(message){
        
        alert(message);
    }
    
     <!--  JS调用oc成功后的回调 --!>

    var shareSuccessCallback = function(){
        
        alert('success');
    }
</script>
</body>
  1. OC部分
#import "ViewController.h"
#import <JavaScriptCore/JavaScriptCore.h>

//先要使用JS调用OC的方法,需要写一个遵循JSExport的协议和协议方法.
@protocol JSObjectDelegate <JSExport>

- (void)share:(NSString *)shareContent;

@end


//在ViewController需要遵循上面我们书写的协议.
@interface ViewController ()<UIWebViewDelegate,JSObjectDelegate>
@property(nonatomic,strong)UIWebView *webview;
@property (strong, nonatomic) JSContext * context;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    
    self.webview = [[UIWebView alloc]initWithFrame:self.view.bounds];
    
    self.webview.delegate = self;
    
    NSURL *url = [[NSBundle mainBundle] URLForResource:@"mainhtml" withExtension:@"html"];
    [self.webview loadRequest:[NSURLRequest requestWithURL:url]];

    
    [self.view addSubview:self.webview];
    
}



-(void)webViewDidFinishLoad:(UIWebView *)webView{

    
    //获取webView的JSContext
    _context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    //ricky和html里面的相一致,相当于桥接,用来实现JS和OC的交互
    _context[@"ricky"] = self;
    
    //异常处理,
    _context.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue){
    
        context.exception = exceptionValue;
        NSLog(@"异常信息:%@", exceptionValue);
    };
}

//实现协议方法,就是js需要调用的OC的方法.
- (void)share:(NSString *)shareContent {
   
    //shareContent就是JS传过来的需要分享的数据
    NSLog(@"share:%@", shareContent);
    
    
    // 分享成功后,使用OC来调用JS成功回调方法

    JSValue *shareCallback = self.context[@"shareCallback"];
    
    //nil:表示该shareCallback回调方法没有参数.
    [shareCallback callWithArguments:nil];
}

二. 使用Blcok进行的交互

1.html部分:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
</head>
<body>
<h1>OC和JS的交互Block方式</h1>
    <div>
        <input type="button" value="JsToOcShare" onclick="callShare(shareContent)">
    </div>

<script>
    var shareContent = JSON.stringify({"title":"分享", "desc":"分享内容", "shareUrl":"http://www.jianshu.com/users/774b1d5616a7/latest_articles"});

    //js向OC传递参数的方法
    function callShare(share) {
    }
    //  OC调JS message为传递的参数
    function showAlert(message){
        alert(message);
    }

</script>
</body>
</html>
  1. OC部分
-(void)showAlter{
    
    NSString *jsStr = @"showAlert('oc js交互成功')";
    [_context evaluateScript:jsStr];
    
}

-(void)webViewDidFinishLoad:(UIWebView *)webView{

    _context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    
    //OC和JS交互
    [self showAlter];
    
    //JS和OC交互
    
    
//    __weak typeof  (self)weakSelf = self;
    
    _context[@"callShare"] = ^(id  obj){
    
        NSLog(@"%@",obj);
        
    };

    //异常处理
    
    _context.exceptionHandler = ^(JSContext *context,JSValue *exceptionValue){
    
        
        context.exception = exceptionValue;
          NSLog(@"异常信息:%@", exceptionValue);
    };
    
}

参考:
http://blog.csdn.net/lizhongfu2013/article/details/9232129
http://www.zuimoban.com/jiaocheng/ios/2016/0427/7091.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,176评论 5 469
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,190评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,232评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,953评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,879评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,177评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,626评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,295评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,436评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,365评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,414评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,096评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,685评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,771评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,987评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,438评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,032评论 2 341

推荐阅读更多精彩内容