面试经验和技巧,JSB 原理与实践,阿里、腾讯大厂前端面试必问知识点系统梳理

可以看到当我们在文本框中输入下列字符并点击按钮后,h5 页面中 id 为 test 的 p 标签内容被修改了。

document.querySelector(‘#test’).innerHTML = ‘I am from native’;

敏锐同学到这一步其实就已经知道我们在日常使用 JSB 时客户端是如何调用前端 JS 代码了,我们在刚刚的静态 html 文件中添加几行 JS 代码:

function evaluateByNative(params) {

const p = document.createElement(‘p’);

p.innerText = params;

document.body.appendChild§;

return ‘Hello Bridge!’;

}

在文本框中输入 evaluateByNative(23333),来看一下调用的结果:

可以看到 Native 端可以直接调用挂载在 window 上的全局方法并传入相应的函数执行参数并且在函数执行结束后 Native 端可以直接拿到执行成功的返回值。

Web 向 Native 发送消息


Web 向 Native 发送消息本质上就是某段 JS 代码的执行端上是可感知的,目前业界主流的实现方案有两种,分别是拦截式注入式

拦截式

和浏览器类似 WebView 中发出的所有请求都是可以被 Native 容器感知到的(是不是想到了Gecko),因此拦截式具体指的是 Native 拦截 Web 发出的 URL 请求,双方在此之前约定一个 JSB 请求格式,如果该请求是 JSB 则进行相应的处理,若不是则直接转发。

Native 拦截请求的钩子方法:

| 平台 | API |

| — | — |

| Android | shouldOverrideUrlLoading |

| iOS 8+ | decidePolicyForNavigationAction |

| iOS 8- | shouldStartLoadWithRequest |

拦截式的基本流程如下

上述流程存在几个问题:

  1. 通过何种方式发出请求?

Web 端发出请求的方式非常多样,例如 <a/>iframe.srclocation.hrefajax 等,但 <a/> 需要用户手动触发,location.href 可能会导致页面跳转,安卓端拦截 ajax 的能力有所欠缺,因此绝大多数拦截式实现方案均采用iframe 来发送请求

  1. 如何规定 JSB 的请求格式?

一个标准的 URL 由 <scheme>://<host>:<port><path> 组成,相信大家都有过从微信或手机浏览器点击某个链接意外跳转到其他 App 的经历,如果有仔细留意过这些链接的 URL 你会发现目前主流 App 都有其专属的一个 scheme 来作为该应用的标识,例如微信的 URL scheme 就是 weixin://JSB 的实现借鉴这一思路,定制业务自身专属的一个 URL scheme 来作为 JSB 请求的标识,例如字节内部实现拦截式 JSB 的 SDK 中就定义了 bytedance:// 这样一个 scheme。

// Web 通过动态创建 iframe,将 src 设置为符合双端规范的 url scheme

const CUSTOM_PROTOCOL_SCHEME = ‘prek’

function web2Native(event) {

const messagingIframe = document.createElement(‘iframe’);

messagingIframe.style.display = ‘none’;

messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + ‘😕/’ + event;

document.documentElement.appendChild(messagingIframe);

setTimeout(() => {

document.documentElement.removeChild(messagingIframe);

}, 200)

}

拦截式在双端都具有非常好的向下兼容性,曾经是最主流的 JSB 实现方案,但目前在高版本的系统中已经逐渐被淘汰,理由是它有如下几个劣势:

  • 连续发送时可能会造成消息丢失(可以使用消息队列解决该问题)

  • URL  字符串长度有限制

  • 性能一般,URL request 创建请求有一定的耗时(Android 端 200-400ms)

实践案例

同样用一个简单的 Demo2 来看一下如何使用拦截式实现 Web 向 Native 发送消息,这里实现了在 Web 端唤起 Native 的相册。

遵循上述实现方式,Web 发送消息的代码如下:

const CUSTOM_PROTOCOL_SCHEME = ‘prek’ // 自定义 url scheme

function web2Native(event_name) {

const messagingIframe = document.createElement(‘iframe’)

messagingIframe.style.display = ‘none’

messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + ‘😕/’ + event_name

document.documentElement.appendChild(messagingIframe)

setTimeout(() => {

document.documentElement.removeChild(messagingIframe)

}, 0)

}

const btn = document.querySelector(‘#btn’)

btn.onclick = () => {

web2Native(‘openPhotoAlbum’)

}

Native 侧通过 decidePolicyForNavigationAction 这一 delegate 实现请求拦截,解析 URL 参数,若 URL scheme 是 prek 则认为该请求是一个来自 Web 的 JSB 调用:

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {

NSURL *url = navigationAction.request.URL;

NSLog(@“拦截到 Web 发出的请求 = %@”, url);

if ([self isSchemeMatchPrek:url]) {

NSString* host = url.host.lowercaseString;

if ([host isEqualToString: @“openphotoalbum”]) {

[self openCameraForWeb]; // 打开相册

NSLog(@“打开相册”);

}

decisionHandler(WKNavigationActionPolicyCancel);

return;

} else {

decisionHandler(WKNavigationActionPolicyAllow);

}

}

为了更清晰地看到 Native 拦截的结果,在上述代理方法中打个断点:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

TCP协议

  • TCP 和 UDP 的区别?
  • TCP 三次握手的过程?
  • 为什么是三次而不是两次、四次?
  • 三次握手过程中可以携带数据么?
  • 说说 TCP 四次挥手的过程
  • 为什么是四次挥手而不是三次?
  • 半连接队列和 SYN Flood 攻击的关系
  • 如何应对 SYN Flood 攻击?
  • 介绍一下 TCP 报文头部的字段
  • TCP 快速打开的原理(TFO)
  • 说说TCP报文中时间戳的作用?
  • TCP 的超时重传时间是如何计算的?
  • TCP 的流量控制
  • TCP 的拥塞控制
  • 说说 Nagle 算法和延迟确认?
  • 如何理解 TCP 的 keep-alive?

浏览器篇
  • 浏览器缓存?
  • 说一说浏览器的本地存储?各自优劣如何?
  • 说一说从输入URL到页面呈现发生了什么?
  • 谈谈你对重绘和回流的理解
  • XSS攻击
  • CSRF攻击
  • HTTPS为什么让数据传输更安全?
  • 实现事件的防抖和节流?
  • 实现图片懒加载?

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

浏览器篇

  • 浏览器缓存?
  • 说一说浏览器的本地存储?各自优劣如何?
  • 说一说从输入URL到页面呈现发生了什么?
  • 谈谈你对重绘和回流的理解
  • XSS攻击
  • CSRF攻击
  • HTTPS为什么让数据传输更安全?
  • 实现事件的防抖和节流?
  • 实现图片懒加载?

[外链图片转存中…(img-Szp2eQCf-1712609554915)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-z4lzRl1i-1712609554915)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值