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

04-27 570阅读

这里我们在请求参数中加上了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

 {

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) 

psetTimeout(() => {

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前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

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

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

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

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

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

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)

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

计算机网络

  • HTTP 缓存

  • 你知道 302 状态码是什么嘛?你平时浏览网页的过程中遇到过哪些 302 的场景?

  • HTTP 常用的请求方式,区别和用途?

  • HTTPS 是什么?具体流程

  • 三次握手和四次挥手

  • 你对 TCP 滑动窗口有了解嘛?

  • WebSocket与Ajax的区别

  • 了解 WebSocket 嘛?

  • HTTP 如何实现长连接?在什么时候会超时?

  • TCP 如何保证有效传输及拥塞控制原理。

  • TCP 协议怎么保证可靠的,UDP 为什么不可靠?

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

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

    算法

    • 链表

    • 字符串

    • 数组问题

    • 二叉树

    • 排序算法

    • 二分查找

    • 动态规划

    • BFS

    • DFS

    • 回溯算法

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

      为什么不可靠?

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

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

      算法

      • 链表

      • 字符串

      • 数组问题

      • 二叉树

      • 排序算法

      • 二分查找

      • 动态规划

      • BFS

      • DFS

      • 回溯算法

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

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]