H5如何与原生App(ios,安卓,RN)通信?

打印 上一主题 下一主题

主题 989|帖子 989|积分 2969

这里我们在请求参数中加上了cbName=jsCallClientBack,这个jsCallClientBack为JS调用客户端所定义的回调函数,在业务层jsBridge封装中,我们传入一个匿名函数作为回调,底层将这个函数绑定在window的jsbridge对象下并为其定义一个独一无二的key,这个key就是jsCallClientBack,客户端在处理完逻辑后,会通过上面已经介绍过的方法来回调window下的方法。
ps: 在将回调绑定在window下时,特别注意要使用bind保持函数内this的原有指向不变
IOS客户端调用H5方法

Native调用Javascript语言,是通过UIWebView组件的stringByEvaluatingJavaScriptFromString方法来实现的,该方法返回js脚本的实验结果。
// IOS swift code
webview.stringByEvaluatingJavaScriptFromString(“window.methodName()”)
从上面代码可以看出它其实就是实验了一个字符串化的js代码,调用了window下的一个对象,如果我们要让native来调用我们js写的方法,那这个方法就要在window下能访问到。但从全局思量,我们只要袒露一个对象如JSBridge给native调用就好了。
调用客户端原生方法的回调函数也将绑在window下供客户端乐成反调用,实际上一次调用客户端方法最后产生的结果是双向相互调用。
H5调用Android客户端方法

在安卓webView中有三种调用native的方式:
通过schema方式,客户端使用shouldOverrideUrlLoading方法对url请求协议举行解析。这种js的调用方式与ios的一样,使用iframe来调用native方法。通过在webview页面里直接注入原生js代码方式,使用addJavascriptInterface方法来实现。
// android JAVA code
class JSInterface {
@JavascriptInterface
public String getShare() {
//…
return “share”;
}
}
webView.addJavascriptInterface(new JSInterface(), “AndroidNativeApi”);
上面的代码就是在页面的window对象里注入了AndroidNativeApi对象。在js里可以直接调用原生方法。
使用prompt,console.log,alert方式,这三个方法对js里是属性原生的,在android webview这一层是可以重写这三个方法的。一样平常我们使用prompt,由于这个在js里使用的不多,用来和native通讯副作用比较少。
// android JAVA code
class WebChromeClient extends WebChromeClient {
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
// 重写window下的prompt,通过result返回结果
}
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
}
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
}
}
一样平常而言安卓客户端选用1、2方案中的一种举行通信,从前端层面来讲,保举客户端都使用schema协议的方式,便于前端jsBridge底层代码的维护与迭代。
Android客户端调用H5方法

在安卓APP中,客户端通过webview的loadUrl举行调用:
// android JAVA code
webView.loadUrl(“javascript:window.jsBridge.getShare()”);
H5端将方法绑定在window下的对象即可,无需与IOS作区分
H5调用RN客户端

我们知道RN的webView组件实际上就是对原生容器的二次封装,因此我们不需要直接通过schema协议来通信,只需要使用浏览器postMessage、onMessage来转达消息即可,类似于iframe,而真正的通信过程RN已经帮我们做了。
// h5 js code
window.postMessage(data);
// rn js code
<WebView
ref=“webView”
source={require(‘…/html/index.html’)}
injectedJavaScript={‘window.androidConfig = {}’}    // 通过这个props可以在webView初始化时注入属性方法
onMessage={e => {
let { data } = e.nativeEvent;
//…
}}
/>
RN客户端调用H5

postMessage是双向的,以是也可以在RN里发消息,H5里接消息来触发对应的回调
this.refs.webView.postMessage({
cbName: ‘xxx’,
param: {}
});
前端jsBridge的封装

在了解了js与客户端底层的通信原理后,我们可以将IOS、安卓统一封装成jsBridge提供给业务层开发调用。
class JsBridge {
static lastCallTime
constructor() {
if (UA.isReactNative()) {
document.addEventListener(‘message’, function(e) {
window.jsClientCallBacke.data.cbName;
});
}
}
// 通用callNtive方法
callClient(functionName, data, callback) {
// 制止一连调用
if (JsBridge.lastCallTime && (Date.now() - JsBridge.lastCallTime) < 100) {
setTimeout(() => {
this.callClient(functionName, data, callback);
}, 100);
return;
}
JsBridge.lastCallTime = Date.now();
data = data || {};
if (callback) {
const cbName = randomName();
Object.assign(data, { cbName });
window.jsClientCallBack[cbName] = callBack.bind(this);
}
if (UA.isIOS()) {
data.forEach((key, value) => {
try {
data[key] = JSON.stringify(value);
} catch(e) { }
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里不停到现在。
深知大多数初中级前端工程师,想要提升技能,通常是自己探索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易遇到天花板技能停滞不前!
因此网络整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简朴,就是希望能够资助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。




由于文件比较大,这里只是将部门目录截图出来,每个节点里面都包含大厂面经、学习条记、源码讲义、实战项目、讲解视频
如果你以为这些内容对你有资助,可以添加下面V无偿领取!(备注:前端)

盘算机网络



  • HTTP 缓存
  • 你知道 302 状态码是什么嘛?你平时浏览网页的过程中遇到过哪些 302 的场景?
  • HTTP 常用的请求方式,区别和用途?
  • HTTPS 是什么?具体流程
  • 三次握手和四次挥手
  • 你对 TCP 滑动窗口有了解嘛?
  • WebSocket与Ajax的区别
  • 了解 WebSocket 嘛?
  • HTTP 如何实现长连接?在什么时候会超时?
  • TCP 如何保证有效传输及拥塞控制原理。
  • TCP 协议怎么保证可靠的,UDP 为什么不可靠?

开源分享:【大厂前端口试题解析+核心总结学习条记+真实项目实战+最新讲解视频】
算法



  • 链表
  • 字符串
  • 数组问题
  • 二叉树
  • 排序算法
  • 二分查找
  • 动态规划
  • BFS

  • DFS
  • 回溯算法

    为什么不可靠?

开源分享:【大厂前端口试题解析+核心总结学习条记+真实项目实战+最新讲解视频】
算法



  • 链表
  • 字符串
  • 数组问题
  • 二叉树
  • 排序算法
  • 二分查找
  • 动态规划
  • BFS

  • DFS
  • 回溯算法


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81428

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表