混合式开发HybridApp和前端和安卓数据交互的坑

961 阅读3分钟

HybridApp是我们公司现在APP的主要开发模式,原生APP和前端通过jsbridge交流数据,实现业务功能,HybridApp的优点和缺点都比较明显:

  • 优点,页面由前端H5实现,前端一套代码运行在两端,开发速度提升
  • 缺点速度和性能相较于原生APP较慢,前端和原生端交流比较麻烦

HybridApp开发的原理就是原生在window上面挂载一个jsbridge对象,这个对象名字可以自己规定, 前端就可以通过调用jsbridge上面的各种方法和原生进行通信。

下面来说说开发时候遇到的一些坑:

1.使用远程H5的坑

最开始公司的APP是把H5项目托管到七牛云上面,APP进入页面都是直接访问七牛云的地址,这样做有几个坑:

  1. 加载速度很慢,由于页面页面在远程所以加载很慢,用户体验不好
  2. 版本问题太多:由于H5每次迭代都会让页面变为最新的,这样一旦加入了新的和原生交互的API在一些没更新APP的用户的APP上面就会报错,这问题就非常致命,所以前端代码里就出现了很多判断jsbridge版本的逻辑:

image.png 长此以往判断版本的逻辑多了代码的可读性变的非常差

以上两个问题最后用的解决办法是使用APP本地服务。

把H5资源内置到APP中,APP启动服务访问本地加载HTML文件,这个解决了加载慢的问题,加载速度有明显提升,第二个解决了大量了版本判断问题,每个版本H5包和APP版本同步,不会出现错乱的现象。

但是这么做有另一个问题就暴露出来,H5资源多的时候APP打包体积变得很大,目前有个项目H5打包体积有25M,大部分是图片资源,这是一个头疼并且一直在考虑怎么解决的问题,有兴趣的大佬麻烦评论区支个招。

2.安卓JSON反斜杠转义问题

安卓jsbridge和前端交互只能传字符串,iOS可以传对象类型,所以遇到对象类型只能让安卓转成JSON字符串前端再解析,但是遇到反斜杠\就会出现一个很神奇的问题,JSON.parse直接报错:

image.png

这是啥子原因的,我看了下,是安卓传过来的字符串有问题,当出现\的时候它本身是个转义符,所以JSON.parse的时候\\会被解析成\,一个反斜杠就直接报错,沟通了安卓开发小伙伴,结果不出意外,安卓端表示不好处理,这就得靠自己来了。想了两种方法:

  • 第一种快速粗暴的办法,整个APP输入的地方不算多,直接禁用输入框输入反斜杠,正常用户反正也不用输入反斜杠,但是终归不太好
  • 第二种既然安卓返回的反斜杠都缺了一般那就手动给它补上一半,直接匹配安卓传给前端的字符串用String.prototype.replaceAll()去搞定
data.replaceAll('\\', '\\\\')

至此再用JSON.parse就可以正常解析了