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

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

发布时间:2019-08-21 22:13:36 所属栏目:业界 来源:朱德权
导读:移动开拓规模连年来已经逐渐辞别了蛮横发展的时期,进入了相对成熟的期间。而一向以来 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 的跨平台技能

(编辑:湖南网)

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

热点阅读