背景:
做hybrid開發(fā)都會(huì)用到j(luò)sbridge,但是最近遇到了一個(gè)問題,同時(shí)并發(fā)發(fā)送多個(gè)請(qǐng)求,native端只能攔截到最后一次請(qǐng)求,前面的請(qǐng)求沒法攔截。然后改成用location.href='scheme'這種方式是可以讓native端都能攔截到,但是會(huì)產(chǎn)生內(nèi)部webview后退時(shí),請(qǐng)求不了native。但是看了下jsbridge的通用做法都是用iframe來發(fā)送scheme請(qǐng)求,但是就會(huì)出現(xiàn)開頭說的并發(fā)發(fā)送的問題,當(dāng)前解決方式是做了個(gè)隊(duì)列,然后把并行調(diào)用強(qiáng)行轉(zhuǎn)成串行調(diào)用。今天看到了新公司得實(shí)現(xiàn)方法,大概思路如下:
iframe并發(fā)發(fā)送多個(gè)請(qǐng)求的實(shí)現(xiàn)思路:
由于公司保密協(xié)議不能提供源代碼,請(qǐng)諒解,說下思路。
- 假設(shè)jsbridge提供了方法call();
- 每次調(diào)用call時(shí),會(huì)把當(dāng)前所有的數(shù)據(jù)緩存到一個(gè)數(shù)組變量sendMessage里面。
- 每次調(diào)用都會(huì)發(fā)送一個(gè)固定的scheme,scheme://jsbridge
- native接受到這個(gè)消息后,會(huì)調(diào)用js的一個(gè)固定全局方法pullMessage(),該方法返回值是sendMessage數(shù)組里面的所有數(shù)據(jù)的json數(shù)組字符串
- native拿到j(luò)s方法返回的json數(shù)據(jù)字符串進(jìn)行解析,然后針對(duì)每個(gè)調(diào)用進(jìn)行分發(fā)處理,然后再進(jìn)行回調(diào)相應(yīng)的js方法
以上就巧妙的避免了多次請(qǐng)求即使native只拿到了最后一次請(qǐng)求,也不會(huì)漏掉所有的js調(diào)用native的請(qǐng)求。這種做法是把push改成了pull。