加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

移动开拓中的Web:WebView、WebKit、JSCore、Web 优化、热修复、跨平台……

发布时间:2019-08-24 13:42:02 所属栏目:业界 来源:朱德权
导读:移动开拓规模连年来已经逐渐辞别了蛮横发展的时期,进入了相对成熟的期间。而一向以来 Native 和 Web 的争论从未遏制,通过开拓者孜孜不倦的全力,Web 的服从和 Native 的体验也一向在寻求着均衡。本文聚焦 iOS 开拓和 Web 开拓的交错点,内容涉及到 iOS

WKWebView 最为明显的改变,就是不支持 NSURLProtocol,为了兼容旧的营业逻辑,一部门 App 通过 WKBrowsingContextController 中的非果真要领实现了 NSURLProtocol。

  1. // WKBrowsingContextController 
  2.  + (void)registerSchemeForCustomProtocol:(NSString *)scheme WK_API_DEPRECATED_WITH_REPLACEMENT("WKURLSchemeHandler", macos(10.10, WK_MAC_TBA), ios(8.0, WK_IOS_TBA)); 

在 iOS11 中,体系增进了 setURLSchemeHandler 函数用来拦截自界说的 Scheme,可是差异于 UIWebView,新的函数只能拦截自界说的 Scheme(SchemeRegistry.cpp),对行使最多的 HTTP/HTTPS 依然不能有用地拦截。

  1. //SchemeRegistry 
  2.  static const StringVectorFunction functions[] { 
  3.      builtinSecureSchemes,                // about;data... 
  4.      builtinSchemesWithUniqueOrigins,     // javascript... 
  5.      builtinEmptyDocumentSchemes, 
  6.      builtinCanDisplayOnlyIfCanRequestSchemes, 
  7.      builtinCORSEnabledSchemes,           //http;https 
  8.  }; 

白屏

凡是 WKWebView 白屏的缘故起因首要分两种,一种是因为 Web 的历程 Crash(多见于内部历程通讯);一种就是 WebView 渲染时的错误(Debug 统统正常只是没有对应的内容)。对付白屏的检测,前者在 iOS9 之后体系提供了对应 Crash 的回调函数,同时业界也有通过判定 URL/Title 是否为空的方法作为帮助;后者业界通过视图树比拟,判定 SubView 是否包括 WKCompsitingView,以及通过随机点截图等方法作为白屏判定的依据。

其余 WKWebView 的体系级题目如 Cookie、POST 参数、异步 JavaScript 等,可以通过营业逻辑的调解从头适配。

因为 WebKit 源码的开放性,我们也可以操作私有要领来简化代码逻辑、实现伟大的产物需求。譬喻在 WKWebViewPrivate 中可以得到各类页面信息、直接取到 UserAgent、 在 WKBackForwardListPrivate 中可以整理掉所有的跳转汗青、以及在 WKContentViewInteraction 中替代要领实现自界说的 MenuItem 等。

  1. @interface WKWebView (WKPrivate) 
  2.  @property (nonatomic, readonly) NSString *_userAgent WK_API_AVAILABLE(macosx(10.11), ios(9.0)); 
  3.  ... 
  4.          
  5.  @interface WKBackForwardList (WKPrivate) 
  6.  - (void)_removeAllItems; 
  7.  ... 
  8.          
  9.  @interface WKContentView (WKInteraction) 
  10.  - (BOOL)canPerformActionForWebView:(SEL)action withSender:(id)sender; 

3. App 中的应用场景

WKWebView 体系提供了四个用于加载渲染 Web 的函数,这四个函数从加载的范例上可以分为两类:加载 URL & 加载 HTMLData。以是基于此也延长出两种差异的营业场景:加载 URL 的页面直出类和加载数据的模板渲染类,同时两种范例各自也有差异的优化重点及偏向。

页面直出类

  1. //按照URL直接展示Web页面 
  2.   - (nullable WKNavigation *)loadRequest:(NSURLRequest *)request; 

凡是种种 App 中的 Web 页面加载都是通过加载 URL 的方法,好比嵌入的运营勾当页面、告白页面等等。

模板渲染类

  1. //按照模板&数据渲染Web页面 
  2.  - (nullable WKNavigation *)loadHTMLString:(NSString *)string baseURL:(nullable NSURL *)baseURL; 
  3.  ... 

必要行使 WebView 展示,且交互逻辑较多的页面,最常见的就是资讯类 App 的内容展示页。

iOS 中 Web 与 Native 的通讯

纯真行使 Web 容器加载页面已经不能满意伟大的成果,开拓者但愿数据可以在 Native 和 Web 之间通讯转达来实现伟大的成果,而 JavaScript 就是通讯的前言。对付有 WebView 的环境,固然 WKWebView 提供了体系级的要领,可是大部门 App 如故行使基于 URLScheme 的 WebViewBridge 用以兼容 UIWebView。而离开了 WebView 容器,体系提供了 JavascriptCore 的框架,它也为之后发杀青长的跨平台和热修复技能提供了也许。

1. 基于 WebView 的通讯

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读