背景:
做hybrid开发都会用到jsbridge,但是最近遇到了一个问题,同时并发发送多个请求,native端只能拦截到最后一次请求,前面的请求没法拦截。然后改成用location.href='scheme'这种方式是可以让native端都能拦截到,但是会产生内部webview后退时,请求不了native。但是看了下jsbridge的通用做法都是用iframe来发送scheme请求,但是就会出现开头说的并发发送的问题,当前解决方式是做了个队列,然后把并行调用强行转成串行调用。今天看到了新公司得实现方法,大概思路如下:
iframe并发发送多个请求的实现思路:
由于公司保密协议不能提供源代码,请谅解,说下思路。
- 假设jsbridge提供了方法call();
- 每次调用call时,会把当前所有的数据缓存到一个数组变量sendMessage里面。
- 每次调用都会发送一个固定的scheme,scheme://jsbridge
- native接受到这个消息后,会调用js的一个固定全局方法pullMessage(),该方法返回值是sendMessage数组里面的所有数据的json数组字符串
- native拿到js方法返回的json数据字符串进行解析,然后针对每个调用进行分发处理,然后再进行回调相应的js方法
以上就巧妙的避免了多次请求即使native只拿到了最后一次请求,也不会漏掉所有的js调用native的请求。这种做法是把push改成了pull。