iOS中OC和JS的互调

首先我们要考虑到iOS中OC和JS相互交互的方案:
一、WebView的代理:
在大部分的app中直接使用,可以在WebView的代理方法中,通过拦截的方式与native进行交互,通常是通过拦截url scheme判断是否是我们需要拦截处理的url及其所对应的要处理的功能是什么。任意版本都支持。
二、JavaScriptCore:
需在iOS7之后就出现了JavaScriptCore.framework来用于和JS进行交互,但是它不支持iOS6,那么对于还需要支持iOS6的APP来说,就可以暂时不用考虑了。
三、WebViewJavascriptBridge:
我们也可以使用WebViewJavascriptBridge开源库,它的本质也是通过webview的代理拦截scheme,然后再注入相应的JS代码的。

**UIWebView:
**

**1、OC直接调用JS **
①网页加载完成时调用的代理方法
②当网页加载完成之后,通过OC的方法调用JS的代码,删除网页展示时不需要的内容
③OC调用JS的代码还可以给网页中的标签添加点击事件或者给网页添加标签

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

④网页加载完成之后,OC方法调用JS代码

-(nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script

删除前的图片:


**—————————————————————————————————————
**
**————————————————————————————————————— **

以下是OC调用JS代码的具体实现:

[代码]objc代码:

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    // JS的代码
    NSMutableString *JSStM = [NSMutableString string];
     
    /**
     ①找到要删除的对应的标签:var headerTag = document.getElementsByTagName('header')[0];
     ②找到要删除的标签对应的父节点:headerTag.parentNode
     ③从父节点中将要删除的标签移除:headerTag.parentNode.removeChild(headerTag);
     */
    // 删除导航
    [JSStM appendString:@"var headerTag = document.getElementsByTagName('header')[0];headerTag.parentNode.removeChild(headerTag);"];
     
    // 删除中间的“立即购买”按钮
    [JSStM appendString:@"var buyTag = document.getElementsByClassName('buy-now')[0];buyTag.parentNode.removeChild(buyTag);"];
     
    // 删除底部"APP下单返积分抵现金”悬停按钮
    [JSStM appendString:@"var footerBtnTag = document.getElementsByClassName('footer-btn-fix')[0]; footerBtnTag.parentNode.removeChild(footerBtnTag);"];
     
    // 删除底部“各种信息”布局
    [JSStM appendString:@"var footerTag = document.getElementsByClassName('footer')[0]; footerTag.parentNode.removeChild(footerTag);"];
     
    // 给标签“顶部的图片”添加点击事件
    /**
     ①JS中给标签添加相应的事件:弹框
     var figureTag = document.getElementsByTagName('figure')[0].children[0];figureTag.onclick = function(){alert("点我点我点我")};
     ②通过点击某个标签跳转到其他链接:给图片添加点击事件
     var figureTag = document.getElementsByTagName('figure')[0].children[0];figureTag.onclick = function(){window.location.href = 'http://www.baidu.com'};
      
     跳转到百度中的OC调用JS代码
     [JSStM appendString:@"var figureTag = document.getElementsByTagName('figure')[0].children[0];figureTag.onclick = function(){window.location.href = 'http://www.baidu.com'};"];
    */
    // 通过自定义协议头的方式来实现控制器间的跳转,即JS调用OC代码
//    [JSStM appendString:@"var figureTag = document.getElementsByTagName('figure')[0].children[0]; figureTag.onclick = function(){window.location.href = 'xg://?src= '+this.src};"];
    // 也可写成一下代码
    [JSStM appendString:@"var figureTag = document.getElementsByTagName('figure')[0].children[0]; figureTag.onclick = function(){window.location.href = 'xg://www.hahah.com'};"];
     
    // OC调用JS代码
    [webView stringByEvaluatingJavaScriptFromString:JSStM];  
}

**执行以上代码后,删掉框框中的内容后的图片:
**
**
**

**—————————————————————————————————————
**
—————————————————————————————————————

**2、接下来就是JS来调用OC的代码了:
**
①拦截WebView上的所有的网络请求 ②JS和OC进行交互的渠道

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;

③给顶部的图片添加点击事件,使标签可以被点击,让其返回到第一个界面

[代码]objc代码:

// 通过自定义协议头的方式来实现控制器间的跳转,即JS调用OC代码

     
[JSStM appendString:
@"var figureTag = document.getElementsByTagName('figure')[0].children[0]; figureTag.onclick = function(){window.location.href = 'xg://?src= '+this.src};"
];

    
// 也可写成一下代码

    
[JSStM appendString:
@"var figureTag = document.getElementsByTagName('figure')[0].children[0]; figureTag.onclick = function(){window.location.href = 'xg://www.hahah.com'};"
];

④点击事件发送网络请求的目的 : 可以拦截到标签的点击事件;自定义协议的目的 : 是为了给事件添加一个特殊的标记,如果拦截到请求,就可以通过这个特殊的标记来区分要做的事情

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest*)requestnavigationType:(UIWebViewNavigationType)navigationType

{NSLog(@"%@",request.URL.absoluteString);
// 拿到网页上的请求地址
NSString*URLString = request.URL.absoluteString;
// 判断网页的请求地址协议是否是我们自定义的那个

    
NSRange range = [URLString rangeOfString:@"xg://?src="];

//    if (range.length > 0) {
if([URLString isEqualToString:@"xg://www.hahah.com"]){             
NSLog(@"你点击的是图片");      
// 控制器的跳转    
[self .navigationController popToRootViewControllerAnimated: YES];

        
// 拦截到的这个自定义协议的请求时,我是不需要做网页加载的,就返回NO.

        
return NO;        
/**        
温馨提醒:       
①这里点击标签之后,如果不需要加载任何的网页,就需要return NO;        
②如果需求是 : 点击网页的分享图标(按钮),跳转到分享页面,业务逻辑跟点击图片实现跳转是一样的,只需要在网页中找到那个分享的标签,确定他的点击事件并发送一个自定义协议头的请求,然后拦截这个特殊协议头的请求即可         
*/   
}   
return YES
;
}


**—————————————————————————————————————
**
—————————————————————————————————————

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

推荐阅读更多精彩内容

  • http://blog.csdn.net/y550918116j/article/details/49619847...
    F麦子阅读 899评论 2 0
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,803评论 25 707
  • 一、简介 近两年随着HTML5的迅速发展与日趋成熟,越来越多的移动开发者选择使用HTML5来进行混合开发,不仅节约...
    RainyGY阅读 1,860评论 1 12
  • 前言 在iOS开发过程中,一般会有遇到需要和UIWebView交互的需求,即native端和网页端的数据交互,因为...
    wuwy阅读 910评论 0 2
  • ——《不抱怨的世界》读后感 《不抱怨的世界》是美国一位心灵导师威尔·鲍温的作品,这本书的内容如同它的书名一样...
    轻翼阅读 270评论 0 0