Hybrid案例学习

tags: ["Hybrid"]
categories: ["iOS"]

花了两三天时间试用了一下Cordova,也粗略看了一下VasSonic源码,两者在对hybrid的探索上都有很好的参考价值,只是初步使用,理解有限,简单说下自己的见解。Cordova主要侧重于框架封装,使用这套框架可以比较方便的和Native进行交互,提供原生Api给web开发使用。VasSonic侧重于性能优化,极致的提高了web页面的加载速度。

Cordova

可以很方便的根据官网提供的指令创建初始Cordova工程,也可以稍微麻烦一点集成进已有工程,不做重点讨论。说一下体验,按照官网教程,创建体验demo,在cordova build的时候失败,也运行不起来,完全按照官方流程一步一步运行却出错,对于初学者很不友好,排查错误也没找到好的解决方法,网络上相关文档不多,当然这不是本节重点。按照上面教程将cordova集成进已有APP,本节重点在于分析其运行原理及提供plugin给web端使用的能力。

Cordova对web的性能提升没做优化,甚至由于其经过Cordova.js的处理还略有降低,比如在Cordova编写的web页面中,想要打开一个链接,由于Cordova.js中的消息拦截并不能直接打开,需要相应的plugin去处理,否则无法打开。

Cordova的优势在于,使用这套框架可以便捷的和原生Api进行交互。其框架如下图:

架构图

Cordova框架 主要由三部分组成:WebView Web App Plugins

使用这套框架可以进行跨平台开发或者单端平台开发。

WebvView:提供开发的承载容器,可以作为组件使用,在iOS中采用UIWebView作为承载。

Web App:应用程序本身是作为web页面实现的,和常规web页面开发方式区别不大,有一个非常重要的文件config.xml,是配置一些配置plugin及关键配置的地方。

Plugins:Cordova不可或缺的一部分,为Cordova和本地组件提供了相互通信的接口,并提供了与Native Api的绑定,使JS能够方便的调用Native代码。

Cordova提供了很多封装好plugin,可以方便的集成,也可以准守其plugin开发规范,开发出自己想要的插件。在官网提供的plugin中,如右图所示,大多数plugin更新都在两三年前。此外看到的现象是使用者越来越少,相关博客较少,大多数相关博文,也都是很久之前跟新的内容,停留在基础使用层次。

通信流程

在自己需要进行开发的web页里引入外部脚本文件cordova.js[, cordova_plugins.js]cordova.js是JS一侧的处理消息的地方,cordova_plugins.js是 plugins的JS接口。当JS需要和Native进行交互时最终消息都会通过cordova.exec执行


cordova.exec(function(winParam) {}, 

 function(error) {},

 "service",

 "action",

 ["firstArgument", "secondArgument", 42, false]);

第一个参数是成功的回调函数,

第二个参数是失败的回调参数,

service 即 plugin的名字,

Action 是调用的native中的函数名字,

最后是一个数组,可以传给native的参数。


调用这个函数之后,这并不是真正发给native的消息,因为假跳转拦截有两个弊端:

1.连续发送两条消息,只能收到1条,会丢失其中一条,

2.受HTTP协议限制,url的长度有限制,最大不超过2K字符左右

Cordova进行的处理是进行再封装:


if (successCallback || failCallback) {

 callbackId = service + cordova.callbackId++;

 cordova.callbacks[callbackId] =

 {success:successCallback, fail:failCallback};

 }

在cordova.js中维持一个数组,根据service和自增的callbackid 拼接的字符串做为回调的callbackid,由successCallbackfailCallback作为其value

然后将这些参数组成一个数组,


var command = [callbackId, service, action, actionArgs];

再将数组转换为JSON String 存入一个指令集中


commandQueue.push(JSON.stringify(command));

commandQueue是一个 队列,里面放着JS->Native的信息。

最后执行pokeNative 函数,如果有多条消息,则间隔50毫秒发送一条固定的gap://ready 消息,这样间接解决了假跳转拦截的两个弊端。

这样就将****JS->Native****的信息发送出去了。

在Native侧,通过无差别的拦截request,当拦截到gap://ready 消息后,Native会创建一个CDVViewController类来处理这个消息,通过


stringByEvaluatingJavaScriptFromString:

执行JS提供的固定函数:


cordova.require(‘cordova/exec’).nativeFetchMessages()

,来获取刚才存储到commandQueue中的参数,将其JSON序列化之后得到需要执行的command数据,Native也维护一个队列,每次取以一条消息执行,如果有多条消息,也是间隔一个固定时间去执行。

command消息包含callbackIdclassNamemethodNamearguments

四个属性,callbackId是native执行完消息后需要回调给JS的唯一标示,className也即使要执行的plugin,这样就知道了哪一个类需要执行什么方法,需要什么参数。当native处理完了之后,将执行的结果添加上CDVCommandStatus标识后封装成CDVPluginResult类型,回调的结果支持基本数据类型,当然最后都是转换位JSON,最后通过CDVCommandDelegateImpl根据CDVPluginResultcallbackID生成参数回调给JS,也是通过webView的stringByEvaluatingJavaScriptFromString进行。

再根据callbackid找到之前保存的


var callback = cordova.callbacks[callbackId]

这样拿到之前定义好的的callback.success 或者 callback.fail将结果返回给调用方。

至此一个完整的基本调用过程就完成了。

Cordova总结


通信流程不算复杂,这里iOS平台使用了UIWebView作为基础webView,但是UIWebView在iOS12之后要被淘汰,那么Cordova框架将会有很大的改变,并且消息需要转换为JSON String去处理,JS和Native都要做相应的转码,此外有多条消息时需要等待一段时间才能处理,只能异步回调。

分析完Cordova的执行的流程之后,基本就能了解为什么自定义plugin这么方便了。因为plugin要做的事情很简单:

1.只需继承CDVPlugin,

2.提供一个函数包含CDVInvokedUrlCommand类型的参数

3.如果需要回掉,则让父类CVDPlugin中的代理commandDelegate,执行相应方法即可sendPluginResult: callbackId:

不需额外关注其他的事情,在上一篇文章里介绍了通信的方式,这里分析完Cordova,学习到了设计通信框架的一个思路,即简洁的给Native提供通信接口,使native功能模块只需关注实现独立的功能即可。可以借鉴Cordova上已有的plugin,封装咱们自己的Native组件。

VasSonic

腾讯的VasSonic解决的问题是web性能问题,WebView加载慢主要有几个问题:


1.webView初始化

2.页面资源加载

3.数据更新问题

针对这几个问题,VasSonic给出了相应的解决方案:


1.webView首次启动初始化慢,预先创建webView池

2.在资源加载上做的优化是,初始化webView和request数据并行处理,CDN加速,域名解析优化等

3.数据更新问题,则使用动态加载,缓存数据,局部刷新及预加载技术,局部刷新又包含h5模板拆分等功能点。

开源的VasSonic对webView加载速度优化很强大,能给用户带来更好的体验,但是涉及到了很多的技术,需要web端、iOS、Android、后端一起进行优化,需要有人统筹,短期内各端可以借鉴单端的优化,比如iOS可以借鉴其中的预先创建webView池及并行加速技术,缓存策略也是需要学习借鉴的一个技术点,这些需要进行持续研究。

关于性能优化可以参考:

腾讯团队:腾讯祭出大招VasSonic,让你的H5页面首屏秒开!

美团技术:WebView性能、体验分析与优化

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

推荐阅读更多精彩内容