移动开发领域近年来已经逐渐告别了野蛮生长的时期,进入了相对成熟的时代。而一直以来Native和Web的争论从未停止,通过开发者孜孜不倦的努力,Web的效率和Native的体验也一直在寻求着平衡。本文聚焦iOS开发和Web开发的交叉点,希望能通过简要的介绍,帮助开发者一窥Hybrid和大前端的构想。



插播广告 —— 几十行代码完成资讯类App多种形式内容页

HybridPageKit :一个针对资讯类App高性能、易扩展、组件化的通用内容页实现框架。


- 目录-



- iOS中Web容器与加载-


1. iOS中的Web容器

目前iOS系统为开发者提供三种方式来展示Web内容:

2. WebKit框架与使用


3. App中的应用场景

WKWebView系统提供了四个用于加载渲染Web的函数。这四个函数从加载的类型上可以分为两类:加载URL & 加载HTML\Data。所以基于此也延伸出两种不同的业务场景:加载URL的页面直出类和加载数据的模板渲染类,同时两种类型各自也有不同的优化重点及方向。


- iOS中Web与Native的通信 -


单纯的使用Web容器加载页面已经不能满足复杂的功能,开发者希望数据可以在Native和Web之间通信传递来实现复杂的功能,而Javascript就是通信的媒介。对于有WebView的情况,虽然WKWebView提供了系统级的方法,但是大部分App仍然使用基于URLScheme的WebViewBridge用以兼容UIWebView。而脱离了WebView容器,系统提供了JavaScriptCore的framework,它也为之后蓬勃发展的跨平台和热修复技术提供了可能。

1. 基于WebView的通信

基于WebView的通信主要有 两个 途径,一个是通过系统或私有方法,获取WebView当中的 JSContext,使用系统封装的基于JSCore的函数通信。另一类就是通过创建自定义Scheme的iframe Dom,客户端在回调中进行拦截实现。

2. 脱离WebView的通信 JavaScriptCore


3. App中的应用场景


- 跨平台与热修复 -


近几年来国内外移动端各种方案如雨后春笋般涌现,“Write once, run anywhere”不再是开发者的向往。剥离跨平台技术在Web侧DSL、virtualDom等方面的优化,以及Native侧Runtime的应用与封装,对于两端通信的核心,依然是JavascriptCore。

而不同于国外开发者对跨平台技术的积极探索,国内开发者也对热修复技术产生了极大的热情。同样作为Native和Web的交叉 - JavascriptCore,依然承担着整个技术结构中的通信任务。

1. 基于Web的热修复技术

对于国内的iOS开发者来说,审核周期、敏感业务、支付分成以及bug修复都催生了热修复方向的不断探索。在苹果加强审核之前,几乎所有大型的App都把热修复当成了iOS开发的基础能力,最近在《移动开发还有救么》中也详细的介绍了相关黑科技的前世今生。在所有iOS热修复的方案中,基于Javascript、同时也是影响最大的就是JSPatch。

2. 基于Web的跨平台技术

随着Google开源了基于Dart语言的Flutter,跨平台的技术又进入了一个新的发展阶段。对于传统的跨平台技术来讲,各个公司以JavascriptCore作为通信桥梁,围绕着DSL的解析、方法表的注册、模块注册通信、参数传递的设计以及OC Runtime的运用等不同方向,封装成了一个又一个跨平台的项目。

而在其中,以Javascript作为前端DSL的跨平台技术方案里,FaceBook的react-native以及阿里(目前托管给了Apache)的Weex最为流行。在网络上两者的比较文章有很多,集中在学习成本、框架生态、代码侵入、性能以及包大小等,各个业务可以根据自己的重点选择合理的技术结构。

而不管是react-native还是Weex,Web和Native的通信桥梁仍然是JavascriptCore。

//weex 举例
JSValue* (^callNativeBlock)(JSValue *, JSValue *, JSValue *) = ^JSValue*(JSValue *instance, JSValue *tasks, JSValue *callback){
	...
  return [JSValue valueWithInt32:(int32_t)callNative(instanceId, tasksArray, callbackId) inContext:[JSContext currentContext]];
};
_jsContext[@"callNative"] = callNativeBlock; 

和热修复技术一样,跨平台又是一个庞大的技术体系,JavascriptCore仅仅是作为整个体系运转中的一个小小的部分,而整个跨平台的技术方案就需要另开多个篇幅进行介绍了。


- iOS中Web相关优化策略 -


随着Web技术的不断升级以及App动态性业务需求的增多,越来越多的Web页面加入到了iOS App当中。与之对应的,首屏展示速度——这个对于移动客户端Web的最重要体验优化,也成为了移动客户端中Web业务最重要的优化方向。

这一章节更为详细的设计与实现,请移步iOS新闻类App内容页技术探索;

1. 不同业务场景的优化策略

对于单纯的Web页面来说,业界早已有了合理的优化方向以及成熟的优化方案,而对于移动客户端中的Web来说,开发者在进行单一的Web优化同时,还可以通过优化Web容器以及Web页面中数据加载方式等多个途径做出优化。

所以对于iOS开发中的优化来说,就是通过Native和Web两个维度的优化关键渲染路径,保证WebView优先渲染完毕。由此我们梳理了常规Web页面整体的加载顺序,从中找出关键渲染路径,继而逐个分析、优化。

2. Web维度的优化

3. Native维度的优化

4. 优化整体流程

所以整体上对于客户端来说,我们可以从Native维度(容器和数据加载)以及Web维度两个方向提升加载速度,按照页面的加载流程,整体的优化方向如下:


- iOS中Web相关延伸业务 -


1. 模板引擎


2. 资源动态更新和管理

无论是离线包、本地注入的JS、CSS文件、以及本地化Web中的默认图片,目的都是通过提前下载,替换网络请求为本地读取来优化Web的加载体验和成功率。而对于这些资源的管理,开发者需要从下载与更新,以及Web中的访问这两个方面进行设计优化。

3. Javascript Open Api

- 其他 -


插播广告 —— 几十行代码完成资讯类App多种形式内容页

HybridPageKit :一个针对资讯类App高性能、易扩展、组件化的通用内容页实现框架。