简单浅析 Cordova-iOS 核心代码(iOS与JS互相调用)

本文可能只适合新手。基于Cordova 4.0+,讲的比较肤浅,主要是记录一下这段时间对Cordova的学习。文笔比较不好,如有错误欢迎指正,欢迎探讨。

总结在前:

OC调用js
一、webview 调用 stringByEvaluatingJavaScriptFromString 方法
注:同步方法,可能会阻塞UI
二、JavaScriptCore做js交互
JSContext *context = [self.webview valueForKeyPath:@“documentView.webView.mainFrame.javaScriptContext"]
[context evaluateScript:XXXX];

js调用OC
一、利用js打开iFrame方式发假请求,webview进行拦截
(默认方式)iframe的方法:添加iframe到html元素中,并设置iframe的src为指定gap://ready(相当于发假的URL请求),触发Native侧UIWebview:shouldStartLoadWithRequest的方法。拦截住此次请求后再调用JS代码向JS侧发起取参数的操作,取回后Native再进行处理。
注:为什么不用document.location: 如果我们连续 2 个 js 调 native,连续 2 次改 document.location 的话,在 native 的 delegate 方法中,只能截获后面那次请求,前一次请求由于很快被替换掉,所以被忽略掉了
二、JavaScriptCore: 在webViewDidFinishLoad完成载入后,对上下文进行设置
JSContext *context = [self.webView valueForKeyPath:”documentView.webView.mainFrame.javaScriptContext"]
context[@"share”] = ^(){….} //设置share 方法

一、简单讲下什么是Cordova

Apache Cordova是一个开源的移动开发框架。允许你用标准的web技术-HTML5,CSS3和JavaScript做跨平台开发。 应用在每个平台的具体执行被封装了起来,并依靠符合标准的API绑定去访问每个设备的功能,比如说:传感器、数据、网络状态等。(摘自官网)
同样的移动开发框架,还有react-native, weex等等。这里不做比较和讨论了。

二、讲下这篇文章的背景

我们今天要讲的,不是如何利用web技术去开发app。
而是底层最核心的代码,native和js的交互。
现如今,Hybrid App非常盛行。我开发的工程也是Hybrid App。注重用户体验,且变动较少的页面,使用Native开发。需要经常迭代的,安卓iOS通用的页面,就使用H5开发。而Native和H5的交互,我们使用的是Cordova工程的部分代码,也就是比较核心的代码,诸如CDVViewContoller等。

举个例子:某公司的考勤页面,是H5页面。在自己公司的App打开这个页面,如果要请假时需要填写backup的同事,此时选择同事是调用App Native本地存储的通讯录数据。这里就涉及到了JS与Native的相互调用和数据的传递。

三、整体的流程

1、利用CDVViewController(或是扩展的类),去加载某个H5链接。
2、该H5页面上某个按钮的点击事件需要请求Native插件。

(由于我们项目对CDVViewController又进行了一层封装,所以插件的加载,JS的注入,不需要对Cordova核心代码进行改动,如config.xml)

(--流程基本是通过断点打出来看的--)


Cordova.png

四、具体是如何交互的,底层机制又是什么?

(JavaScriptCore也是交互的一种方式,但不在本章里讨论 )

1、JS如何调用Native?

(默认方式)iframe的方法:添加iframe到html元素中,并设置iframe的src为指定gap://ready(相当于发假的URL请求),触发Native侧UIWebview:shouldStartLoadWithRequest的方法。拦截住此次请求后再调用JS代码向JS侧发起取参数的操作,取回后Native再进行处理。

xmlHttpRequest的方法:
execXhr.open('HEAD', "/!gap_exec?" + (+new Date()), true);
   execXhr.setRequestHeader('cmds', iOSExec.nativeFetchMessages());
   Native侧UIWebview:shouldStartLoadWithRequest的方法,判定为/!gap_exec来拦截,并从头部取得插件的具体参数

保留该方式的原因:
// XHR mode does not work on iOS 4.2, so default to IFRAME_NAV for such devices.
// XHR mode’s main advantage is working around a bug in -webkit-scroll, which
// doesn’t exist in 4.X devices anyways
(iOS5.x版本因为 -webkit-scroll的IFRAME有BUG,则推荐使用)
因为我们项目现在都是支持iOS 7+,所以采用的都是iframe方式。

2、Native如何执行JS?

UIWebView 有一个这样的方法 stringByEvaluatingJavaScriptFromString

3、底层机制是怎么样的?

底层机制主要是结合1、2两种方式,形成一种一来一往的交互(可以看上述流程图)。
与普通调用1、2两种方法相比较,最核心的点在于:
1、Cordova在JS侧与Native侧均使用了队列来保存互相调用的请求,并生成了callbackid能及时找到与此次请求相关的上下文参数等等。
2、CDVPlugin、CommandDelegate等可以很好的开发插件。注入插件和js的话看个人,可以在继承CDVViewController里面去做。

五、具体的插件开发是什么样的

1、生成cfg文件(主要是对插件的描述)
2、生成.js文件(主要是供H5开发人员可以直接调用)
3、继承CDVPlugin的类去写插件类,有模板可仿照。
具体可看官网 http://cordova.axuer.com/docs/zh-cn/latest/guide/platforms/ios/plugin.html

——————————————————————
参考文章:https://www.jianshu.com/p/e74bc7abac8d (是讲述js与OC调用的,一个系列的,还不错)
http://blog.csdn.net/u011417590/article/details/50895734(是讲述Cordova核心类CDVViewController源码的)
http://blog.csdn.net/Linux7985/article/details/53022371 (相对清晰一点,我的结构也是模仿该篇的,可惜版本貌似比较老了)
http://blog.csdn.net/lq83623/article/details/42478223 (讲的也比较好,但下面的结构图大部分看不懂)
https://www.jianshu.com/p/21477a20707a (主要是插件开发相关)

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