iOS技术专题iOS && AndroidiOS点点滴滴

iOS开发中的Web应用概述

2019-03-26  本文已影响7人  deqzhu

为了更好的阅读体验,建议阅读原文

插播广告 —— 几十行代码完成资讯类App多种形式内容页
HybridPageKit :一个针对资讯类App高性能、易扩展、组件化的通用内容页实现框架。

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

目录

image

iOS中Web容器与加载


1. iOS中的Web容器

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

2. WebKit框架与使用

image
  1. 白屏
    通常WKWebView白屏的原因主要分两种,一种是由于Web的进程Crash(多见于内部进程通信);一种就是WebView渲染时的错误(Debug一切正常只是没有对应的内容)。对于白屏的检测,前者在iOS9之后系统提供了对应Crash的回调函数,同时业界也有通过判断URL/Title是否为空的方式作为辅助;后者业界通过视图树对比,判断SubView是否包含WKCompsitingView,以及通过随机点截图等方式作为白屏判断的依据。
  1. 其他WKWebView的系统级问题如Cookie、POST参数、异步Javascript等等一系列的问题,可以通过业务逻辑的调整重新适配

  2. 由于WebKit源码等开放性,我们也可以利用私有方法来简化代码逻辑、实现复杂的产品需求。例如在WKWebViewPrivate中可以获得各种页面信息、直接取到UserAgent、 在WKBackForwardListPrivate中可以清理掉全部的跳转历史、以及在WKContentViewInteraction中替换方法实现自定义的MenuItem等等。

     ```objc
     @interface WKWebView (WKPrivate)
     @property (nonatomic, readonly) NSString *_userAgent WK_API_AVAILABLE(macosx(10.11), ios(9.0));
     ...
     
     @interface WKBackForwardList (WKPrivate)
     - (void)_removeAllItems;
     ...
     
     @interface WKContentView (WKInteraction)
     - (BOOL)canPerformActionForWebView:(SEL)action withSender:(id)sender;
     ```
    

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

image image

3. App中的应用场景

跨平台与热修复


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

image

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

1. 基于Web的热修复技术

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

2. 基于Web的跨平台技术

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

image

而在其中,以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页面整体的加载顺序,从中找出关键渲染路径,继而逐个分析、优化。

image

2. Web维度的优化

3. Native维度的优化

image

针对这种情况,业界主流的做法就是复用 & 预热。预热即时在App启动时创建一个WKWebView,使其内部部分逻辑预热已提升加载速度。而复用又分为两种,较为复杂的是处理边界条件已达到真正的复用,还有一种较为Triky的办法就是常驻一个空WKWebView在内存。

HybridPageKit提供了易于集成的完整WKWebView重用机制实现,开发者可以无需关注复用细节,无缝的体验更为高效的WKWebView。

image

所以对于一些资讯类App,通常采用Dom节点占位、Native渲染实现的方式进行优化,如图片、地图、音视频等模块。这样不但能减少通信和请求的建立、提供更加友好的交互、也能并行的进行View的渲染和处理,同时减少Web页面的业务逻辑。

HybridPageKit中就提供封装好的功能框架,开发者可以简单的替换Dom节点为NativeView。

image

4. 优化整体流程

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

image

<center>- iOS中Web相关延伸业务 -</center>


1. 模板引擎

[图片上传失败...(image-a6c40b-1553579995776)]

2. 资源动态更新和管理

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

image

3. Javascript Open Api

image

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

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

上一篇 下一篇

猜你喜欢

热点阅读