网易首页 > 网易号 > 正文 申请入驻

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

0
分享至

前言通信原理之先了解webviewh5向ios客户端发送消息IOS客户端调用H5方法H5调用Android客户端方法Android客户端调用H5方法H5调用RN客户端RN客户端调用H5前端jsBridge的封装四、调试

为了提高开发效率,开发人员往往会使用原生app里面嵌套前端h5页面的快速开发方式,这就要涉及到h5和原生的相互调用,互相传递数据,接下来就实践项目中的交互方式做一个简单的记录分享,废话不多说,直接上正文:

由于安卓和ios的处理方式不一样,所以我们要分开处理。先贴上判断访问终端的代码

IOS容器

在IOS客户端中,我们首先要提到的是一个叫UIWebView的容器,苹果对它的介绍是:

UIWebView是一个可加载网页的对象,它有浏览记录功能,且对加载的网页内容是可编程的。说白了UIWebView有类似浏览器的功能,我们使用可以它来打开页面,并做一些定制化的功能,如可以让js调某个方法可以取到手机的GPS信息。

但需要注意的是,Safari 浏览器使用的浏览器控件和 UIwebView 组件并不是同一个,两者在性能上有很大的差距。幸运的是,苹果发布 iOS8 的时候,新增了一个 WKWebView 组件容器,如果你的 app 只考虑支持 iOS8 及以上版本,那么你就可以使用这个新的浏览器控件了。

WKWebView 重构了原有 UIWebView 的14个类,3个协议,性能提升的同时,赋予了开发者更加细致的配置(这些配置仅针对客户端 iOS 开发,对于前端 H5 来说,保持两种容器调用方法的一致性很重要)。

Android容器

在安卓客户端中,webView 容器与手机自带的浏览器内核一致,多为 android-chrome。不存在兼容性和性能问题。

RN容器

在 react-native 开发中,从 rn 0.37 版本开始官方引入了组件,在安卓中调用原生浏览器,在 iOS 中默认调用的是 UIWebView 容器。从 iOS12 开始,苹果正式弃用 UIWebView,统一采用WKWebView。

RN 从0.57起,可指定使用 WKWebView 作为 WebView 的实现

WebView 组件不要嵌套在或原生点击组件中,会造成H5内页面滚动失效

在 iOS 中,并没有现成的 API 让 js 去调用 native 的方法,但是 UIWebView 与 WKWebView 能够拦截 h5 内发起的所有网络请求。所以我们的思路就是通过在 h5 内发起约定好的特定协议的网络请求,如 'jsbridge://bridge2.native?params=' + encodeURIComponent(obj) 然后带上你要传递给 iOS 的参数;然后在客户端内拦截到指定协议头的请求之后就阻止该请求并解析 url 上的参数,执行相应逻辑。

在 H5 中发起这种特定协议的请求方式分两种:

1. 通过localtion.href;通过location.href有个问题,就是如果我们连续多次修改window.location.href的值,在Native层只能接收到最后一次请求,前面的请求都会被忽略掉。

2. 通过iframe方式;使用iframe方式,以唤起 Native。以唤起分享组件为例

然后客户端通过拦截这个请求,并且解析出相应的方法和参数: 这里以 iOS 为例:

看不懂就略过,非重点。。。。。

这里我们在请求参数中加上了 cbName=jsCallClientBack,这个 jsCallClientBack 为 JS 调用客户端所定义的回调函数,在业务层 jsBridge 封装中,我们传入一个匿名函数作为回调,底层将这个函数绑定在 window 的 jsbridge 对象下并为其定义一个独一无二的 key,这个 key 就是 jsCallClientBack,客户端在处理完逻辑后,会通过上面已经介绍过的方法来回调 window 下的方法。

PS: 在将回调绑定在 window 下时,特别注意要使用 bind 保持函数内 this 的原有指向不变。

Native 调用 Javascript 语言,是通过 UIWebView 组件的stringByEvaluatingJavaScriptFromString 方法来实现的,该方法返回 js 脚本的执行结果。

从上面代码可以看出它其实就是执行了一个字符串化的 js 代码,调用了 window 下的一个对象,如果我们要让 native 来调用我们 js 写的方法,那这个方法就要在 window 下能访问到。但从全局考虑,我们只要暴露一个对象如 JSBridge 给 native 调用就好了。

调用客户端原生方法的回调函数也将绑在 window 下供客户端成功反调用,实际上一次调用客户端方法最后产生的结果是双向互相调用。

在安卓webView中有三种调用native的方式:

通过 schema 方式,客户端使用 shouldOverrideUrlLoading 方法对 url 请求协议进行解析。这种js的调用方式与 iOS 的一样,使用 iframe 来调用 native 方法。

通过在 webview 页面里直接注入原生 js 代码方式,使用 addJavascriptInterface 方法来实现。

上面的代码就是在页面的 window 对象里注入了 AndroidNativeApi 对象。在 js 里可以直接调用原生方法。 使用 prompt,console.log,alert 方式,这三个方法对 js 里是属性原生的,在 Android webview 这一层是可以重写这三个方法的。一般我们使用 prompt,因为这个在js里使用的不多,用来和 native 通讯副作用比较少。

一般而言安卓客户端选用1、2方案中的一种进行通信,从前端层面来讲,推荐客户端都使用 schema 协议的方式,便于前端 jsBridge 底层代码的维护与迭代。

在安卓APP中,客户端通过 webview 的 loadUrl 进行调用:

H5端将方法绑定在 window 下的对象即可,无需与 iOS 作区分。

我们知道 RN 的 webView 组件实际上就是对原生容器的二次封装,因此我们不需要直接通过 schema 协议来通信,只需要使用浏览器 postMessage、onMessage 来传递消息即可,类似于 iframe,而真正的通信过程 RN 已经帮我们做了。

postMessage 是双向的,所以也可以在 RN 里发消息,H5 里接消息来触发对应的回调。

在了解了js与客户端底层的通信原理后,我们可以将 iOS、安卓统一封装成 jsBridge 提供给业务层开发调用。

在核心封装的基础上,我们可以还做更多的优化,比如将每个回调函数调用后自我销毁释放内存

安卓使用 chrome://inspect 进行调试,需要科学上网。

iOS使用 mac safari 的 develop 选项进行调试。

使用RN的 http://localhost:8081/debugger-ui 只能调试 RN 代码,无法调试 webView 代码,RN下 webView 调试和对应 native 相同,但是在 chrome://inspect 下会出现样式问题。 除非是纯 RN 编写,直接打包成 APP,否则不建议在 RN 下调用 webView 组件。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
终于出炉,国足23人名单诞生,伊万压哨放弃3将,艾克森+1米9锋霸

终于出炉,国足23人名单诞生,伊万压哨放弃3将,艾克森+1米9锋霸

北门儿
2024-06-05 18:53:34
菲总统“怒”给谁看?

菲总统“怒”给谁看?

直新闻
2024-06-05 17:16:54
突发!县政协主席遇刺身亡!权力任性有多可怕?

突发!县政协主席遇刺身亡!权力任性有多可怕?

大江看潮
2024-06-06 05:39:56
天价合同!李凯尔1.82亿刷新纪录,森林狼疯狂烧钱,老将流泪告别

天价合同!李凯尔1.82亿刷新纪录,森林狼疯狂烧钱,老将流泪告别

九霄云者
2024-06-05 15:44:49
突发!县政协主席,遇刺身亡!!

突发!县政协主席,遇刺身亡!!

仕道
2024-06-05 18:52:21
铁头,一个流氓而已

铁头,一个流氓而已

紫雨随风舞
2024-06-05 18:18:36
太难了!东莞又一大型科技企业宣布倒闭清算,年均产值达5亿以上

太难了!东莞又一大型科技企业宣布倒闭清算,年均产值达5亿以上

火山诗话
2024-06-06 07:40:51
美军试射高超音速核导弹 “30分钟内可抵达莫斯科”

美军试射高超音速核导弹 “30分钟内可抵达莫斯科”

参考消息
2024-06-05 15:02:07
有小学老师自曝工资已停发:不只自己,全区几十所小学工资全部停发

有小学老师自曝工资已停发:不只自己,全区几十所小学工资全部停发

西游日记
2024-06-05 09:39:51
房贷月供9300,一家三口晚饭9.5元  网友集体劝:把房子卖了吧

房贷月供9300,一家三口晚饭9.5元 网友集体劝:把房子卖了吧

可达鸭面面观
2024-06-05 15:10:40
给徐辉少将提两点建设性意见

给徐辉少将提两点建设性意见

木蹊说
2024-06-05 13:42:36
南方罕见倒夏寒来袭,广东比东北还冷!分析:潮湿闷热也不远了

南方罕见倒夏寒来袭,广东比东北还冷!分析:潮湿闷热也不远了

中国气象爱好者
2024-06-05 20:20:36
广西多名钓友钓到“有奖回收”海鱼,水产研究所回应

广西多名钓友钓到“有奖回收”海鱼,水产研究所回应

齐鲁壹点
2024-06-05 21:58:17
高考倒计时1天!一图读懂2024年北京高考安排

高考倒计时1天!一图读懂2024年北京高考安排

北青网-北京青年报
2024-06-06 09:17:27
足坛狂欢夜:法国3-0 西班牙5-0 哈兰德戴帽 姆巴佩1射2传获10分

足坛狂欢夜:法国3-0 西班牙5-0 哈兰德戴帽 姆巴佩1射2传获10分

狍子歪解体坛
2024-06-06 05:26:13
真实市政府办公务员的一天是怎样度过的?8点半到单位晚上9点半才能走

真实市政府办公务员的一天是怎样度过的?8点半到单位晚上9点半才能走

火锅局
2024-06-05 23:57:32
哈兰德帽子戏法,一战横扫质疑!3-0欧洲鱼腩,挪威主场大捷

哈兰德帽子戏法,一战横扫质疑!3-0欧洲鱼腩,挪威主场大捷

我的护球最独特
2024-06-06 02:59:01
真相大白!胡塞宣称的袭击“艾森豪威尔”号,竟然是一个国际玩笑

真相大白!胡塞宣称的袭击“艾森豪威尔”号,竟然是一个国际玩笑

吃鱼思故渊
2024-06-05 21:27:23
领导潜规则员工后续:公司及女主真容被扒,前员工曝领导特殊癖好

领导潜规则员工后续:公司及女主真容被扒,前员工曝领导特殊癖好

洛洛女巫
2024-06-05 22:59:20
马斯克毁了原始部落!星链计划接入9个月,村民沉迷色情片行为大变

马斯克毁了原始部落!星链计划接入9个月,村民沉迷色情片行为大变

小星球探索
2024-06-05 22:18:18
2024-06-06 10:12:49
小象Web开发
小象Web开发
专注于web开发领域
25文章数 910关注度
往期回顾 全部

科技要闻

首次超越苹果!英伟达市值突破3万亿美元

头条要闻

生父卖掉女儿致其遭侵犯数十次:卖初夜得1500元好处费

头条要闻

生父卖掉女儿致其遭侵犯数十次:卖初夜得1500元好处费

体育要闻

赴美试训的崔永熙,表现究竟怎么样?

娱乐要闻

《青春有你》胡文煊被曝孕期出轨

财经要闻

特步和七匹狼世纪联姻 家族身价超600亿?

汽车要闻

又一个水桶车 试驾新“卷王”极狐阿尔法S5

态度原创

教育
时尚
家居
手机
本地

教育要闻

乾坤未定的那年,他们这样考上北大

70后的女人可以多时髦?看到这些搭配就知道了,靠穿衣逆袭

家居要闻

温室余闲 平仄之间雅趣浓

手机要闻

真是想不通,诺基亚3210能一机难求

本地新闻

我和我的家乡|踏浪营口,心动不止一夏!

无障碍浏览 进入关怀版