一、布景
为了节省开发成本,有时也为了能够和小程序开发同步,移动端的一些事务常常交给网页端的同学去做,原生则负责为网页端同学供给一个安稳,牢靠的WebView环境,必要时,还要给网页端同学供给一些接口,用于调用原生能力。
相信咱们关于这种混合开发的场景都非常常见。
现如今,跟着实时音视频通信的流行,WebRTC技能也会常常被用到。有时咱们期望直接在H5页面中运用WebRTC(运用自布置的stun/turn服务),往往会遇到哪些挑战?
- 体系WebView内核在不同的机器上体现不一致,常常带来适配噩梦,甚至无法支撑
- 权限问题坑较多
二、抹平设备差异
TBS内核计划
即便不是为了处理WebRTC环境问题,咱们也应该考虑为H5同学去尽量抹平WebView内核带来的差异。假如咱们有WebView sdk团队,能够运用自研的WebView内核。但除了大厂以外,很难有这方面的资源。
所以现在咱们只能借助一些免费的第三方sdk,如腾讯TBS(以前叫X5内核)
TBS免费版内核是根据chromium m89版本的,且在多年前的623xx版本就完成了对WebRTC的支撑,这有助于咱们隔离不同设备的体系WebView内核差异。
可是,我要说可是了,免费版还是有免费版的问题。
无法安稳下发的动态布置
TBS的内核是动态布置的,内核文件由腾讯的服务器下发。既然是动态下发的,那就有千千万万种可能会下发失利。假如下发失利,TBS会降级到体系内核。尽管体系内核也是能够持续用的,但就无法到达抹平设备差异的目的了。
最常见的内核下载错误是-134等,官方文档给出的解释是“命中流控”。依照咱们监控的线上数据,一般时段失利率在3%左右,并且到了周末会激增,由于周五周六(18:00-21:00)属于服务器保护期,不支撑下载。
尽管动态布置的安稳性不可控,但TBS官方也并不供给免费的静态布置的计划。
还记得大明湖畔的 bugly OTA 功用吗?
上一年bugly就有过关停了免费OTA事务的先例,而今年TBS也开端推商业版了。尽管TBS现已免费了多年,但还是不排除什么时候TBS也会关停免费版,毕竟腾讯的产品,不氪金你能变强吗?
以下依然根据TBS计划来完结完成
尽管以上有这么多的危险预警,由于没有找到更为牢靠的平替计划,所以以下完成依然抛砖引玉的根据TBS计划。
假如咱们有更好的计划也能够在谈论区说下哦~
三、权限控制
权限动态请求
众所周知,Android 6.0后推出了权限的动态请求。WebRTC作为一种需求用到相机和麦克风的技能,天然逃不过权限请求。
关于体系WebView内核,来自H5的权限请求一般在WebChromeClient中回调。
webview.setWebChromeClient(new WebChromeClient(){
// Need to accept permissions to use the camera
@Override public void onPermissionRequest(final PermissionRequest request) {
request.grant(request.getResources()); }
}
);
但TBS阻拦了原始的WebChromeClient中onPermissionRequest回调,而是通过IX5WebChromeClientExtension的onPermissionRequest来重新封装了来自H5的权限请求回调
webview.setWebChromeClientExtension(new IX5WebChromeClientExtension() {
// ....... 省略其他方法完成
@Override public boolean onPermissionRequest(String s, long l, MediaAccessPermissionsCallback mediaAccessPermissionsCallback) {
long allowed = 0;
allowed = allowed | MediaAccessPermissionsCallback.ALLOW_AUDIO_CAPTURE;
boolean retain = true;
mediaAccessPermissionsCallback.invoke(s, allowed, retain);
return true;
}
});
其中,关于MediaAccessPermissionsCallback.invoke()
/**
* @params origin 请求权限的网页地址
* @params resouorces 请求的权限类型,位操作辨认
* @params retain 是否缓存成果,缓存后,同一个origin请求同一权限都回来此成果而不会再次回调
*/
public void invoke(String origin, long allow, boolean retain);
扩展完成
当然,出于安全合规考虑,回调中还能够做一些扩展完成:
- 对origin进行鉴权,关于不在白名单的网址,一概直接拒绝权限
- 动态请求权限时,弹窗奉告用户请求权限的具体用途,防止合规危险
权限静态请求
处理完动态请求的权限后,发现在一些设备上,H5端与音频相关的初始化依然会失利,最终发现是以下权限需求静态添加到AndroidManifest
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
三、WebRTC功用测验
完结了装备,就需求测验下以上办法是否奏效,以下供给了两个快速验证的线上工具:
ZEGO webrtc测验
地址: zegodev.gitee.io/zego-expres…
测验方法很简单,点击“开端测验”即可,测验完后,页面会奉告每一项的测验成果。
Janus WebRTC Server VideoCall
地址:janus.conf.meetecho.com/videocallte…
可通过这个demo验证网页端的WebRTC视频通话
总结
本文介绍了根据TBS为网页端同学供给一个完整的WebRTC支撑的实践计划,并在实践事务中落地。诚然TBS为这个计划供给了支撑,也成为了这个计划中最大的危险,但苦于没有好的平替计划,又期望能为用户供给更牢靠的服务,最终咱们选择了静静充钱氪金[doge]。
假如本文对你有协助,记得点个赞哦~