加入收藏 | 设为首页 | 会员中心 | 我要投稿 晋中站长网 (https://www.0354zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 评论 > 正文

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

发布时间:2019-08-22 01:20:31 所属栏目:评论 来源:朱德权
导读:移动开发领域近年来已经逐渐告别了野蛮生长的时期,进入了相对成熟的时代。而一直以来 Native 和 Web 的争论从未停止,通过开发者孜孜不倦的努力,Web 的效率和 Native 的体验也一直在寻求着平衡。本文聚焦 iOS 开发和 Web 开发的交叉点,内容涉及到 iOS

Native - Web:通过 JavascriptCore,Native 可以直接在 Context 中执行 JS 语句,和 Web 侧进行通信和交互。

  1. JSValue *value = [self.jsContext evaluateScript:@"document.cookie"]; 

Web - Native:对于 Web 侧向 Native 的通信,JavascriptCore 提供两种方式,注册 Block & Export 协议。

  1. //Native 
  2.   self.jsContext[@"addMethod"] = ^ NSInteger(NSInteger a, NSInteger b) { 
  3.     return a + b; 
  4.   }; 
  5.          
  6.   //JS 
  7.   console.log(addMethod(1, 2));    //3 
  8.  
  9.   //Native 
  10.   @protocol testJSExportProtocol <JSExport> 
  11.   @property (readonly) NSString *string; 
  12.   ... 
  13.   @interface OCClass : NSObject <testJSExportProtocol> 
  14.          
  15.   //JS 
  16.   var OCClass = new OCClass(); 
  17.   console.log(OCClass.string); 

3. App 中的应用场景

  • 基于 WebView 的通信,主要用于 App 向 H5 页面中注入的 JavaScript Open Api,如提供 Native 的拍照、音视频、定位,以及 App 内的登录与分享等功能。
  • JavascriptCore,则催生了动态化、跨平台以及热修复等一系列技术的蓬勃发展。

跨平台与热修复

近几年来国内外移动端各种跨平台方案如雨后春笋般涌现,“Write once, run anywhere”不再是空话。这些跨平台技术方案的切入点是在 Web 侧 DSL、virtualDom 等方面的优化,以及 Native 侧 Runtime 的应用与封装,但两端通信的核心,依然是 JavascriptCore。

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

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

1. 基于 Web 的热修复技术

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

基于上文的分析,对于脱离 WebView 的 Native 和 Web 间的通信,我们只能使用 JavascriptCore。而在 JavascriptCore 中提供了两种方式用于通信,即 Context 注册 Block 的回调,以及 JSExport。对于热修复的场景来说,我们不可能把潜在需要修复的函数都一一使用协议进行注册,更不能对新增方法和删除方法等进行处理,所以在 Native 和 Web 通信这个维度,我们只能采用 Context 注册 Block 的方式。

  1. // 注册回调 
  2.  context[@"_OC_callI"] = ^id(JSValue *obj, NSString *selectorName, JSValue *arguments, BOOL isSuper) { 
  3.      return callSelector(nil, selectorName, arguments, obj, isSuper); 
  4.  }; 
  5.  context[@"_OC_callC"] = ^id(NSString *className, NSString *selectorName, JSValue *arguments) { 
  6.      return callSelector(className, selectorName, arguments, nil, NO); 
  7.  }; 

确定了通信采用 Block 回调的方式后,热修复就面临着如何在 JS 中调用类以及类的方法的问题。由于没有使用 JSExport 等方式,JS 是无法找到相应类等属性和方法的,在 JSPatch 中,通过简单的字符串替换,将所有方法都替换成通用函数 (__c),然后就可以将相关信息传递给 Native,进而使用 runtime 接口调用方法。

  1. // 替换全部方法调用 
  2.  static NSString *_replaceStr = @".__c("$1")("; 
  3.  
  4.  // 调用方法 
  5.  __c: function(methodName) { 
  6.      ... 
  7.      return function(){ 
  8.          ... 
  9.         var ret = instance ? _OC_callI(instance, selectorName, args, isSuper): 
  10.                              _OC_callC(clsName, selectorName, args) 
  11.         return _formatOCToJS(ret) 
  12.    } 

当然对于 JSPatch 以及其它热修复的项目来说,Web 和 Native 通信只是整个框架中的一个技术点,更多的实现原理和细节由于篇幅的关系暂且不作介绍。

2. 基于 Web 的跨平台技术

(编辑:晋中站长网)

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

热点阅读