CN109857515B - 桥接通信方法、装置、设备及计算机可读存储介质 - Google Patents
桥接通信方法、装置、设备及计算机可读存储介质 Download PDFInfo
- Publication number
- CN109857515B CN109857515B CN201811566923.8A CN201811566923A CN109857515B CN 109857515 B CN109857515 B CN 109857515B CN 201811566923 A CN201811566923 A CN 201811566923A CN 109857515 B CN109857515 B CN 109857515B
- Authority
- CN
- China
- Prior art keywords
- bridging
- message
- function
- preset
- callback
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Stored Programmes (AREA)
Abstract
本发明公开了一种桥接通信方法、装置、设备及计算机可读存储介质,该方法包括:当监测到直译式脚本语言JS代码文件时,根据桥接框架接收到的字段确定目标容器标签,并依据所述目标容器标签选择对应的目标桥接策略;当所述目标桥接策略为第一预设桥接策略时,从所述JS代码文件中捕获调用的JS函数的参数,并将所述参数转换为对应的原生应用参数;当所述目标桥接策略为第二预设桥接策略时,将所述JS代码文件中调用的JS函数的JS消息映射至回调管理器;从所述回调管理器中捕获所述JS消息,并对所述JS消息进行解析,得到原生应用参数。本发明能够提高web容器与原生应用之间的通信有效性。
Description
技术领域
本发明涉及应用开发的技术领域,尤其涉及一种桥接通信方法、装置、设备及计算机可读存储介质。
背景技术
混合模式移动应用,指介于web应用与原生应用之间的程序应用,兼具原生应用良好的用户体验和web应用跨平台开发的优势,由于web应用与原生应用之间的开发语言不同,两者之间无法直接通信,目前,主要通过桥接的方式实现web容器与原生应用之间的通信。
现有的桥接方式为webViewJavascriptBridge,其主要基于假跳转请求拦截实现,即在web界面触发假请求,该假请求不响应任何数据,原生应用通过代理拦截到该假请求,并解析该假请求的URL字段信息,然后基于与web界面约定好的解析协议和URL(UniformResoure Locator,统一资源定位符)字段信息,实现web容器与原生应用之间的通信。
然而,假跳转的请求为模拟跳转,当JS(JavaScript,直译式脚本语言)连续发送多条跳转请求时,web容器会直接过滤掉后发的跳转请求,web容器与原生应用之间无法通信,此外,假跳转的请求依赖于URL链接的跳转,桥接通信的内容需要包含在URL,而URL长度是有限制的,从而限制桥接通信的内容,web容器与原生应用之间无法有效的通信。因此,如何提高web容器与原生应用之间的通信有效性是目前亟待解决的问题。
发明内容
本发明的主要目的在于提供一种桥接通信方法、装置、设备及计算机可读存储介质,旨在提高web容器与原生应用之间的通信有效性。
为实现上述目的,本发明提供一种桥接通信方法,所述桥接通信方法包括以下步骤:
当监测到直译式脚本语言JS代码文件时,根据桥接框架接收到的字段确定目标容器标签,并依据所述目标容器标签选择对应的目标桥接策略;
当所述目标桥接策略为第一预设桥接策略时,从所述JS代码文件中捕获调用的JS函数的参数,并将所述参数转换为对应的原生应用参数;
当所述目标桥接策略为第二预设桥接策略时,将所述JS代码文件中调用的JS函数的JS消息映射至回调管理器;
从所述回调管理器中捕获所述JS消息,并对所述JS消息进行解析,得到原生应用参数。
进一步地,根据桥接框架接收到的字段确定目标容器标签的步骤包括:
根据桥接框架接收到的字段,判断所述字段是处于第一容器标签对应的字段,还是处于第二容器标签对应的字段;
若所述字段处于第一容器标签对应的字段,则将所述第一容器标签确定为目标容器标签;
若所述字段处于第二容器标签对应的字段,则将所述第二容器标签确定为目标容器标签。
进一步地,将所述JS代码文件中调用的JS函数的JS消息映射至回调管理器的步骤包括:
从所述JS代码文件中获取调用的JS函数的JS消息和预设桥接对象的消息传输函数;
通过预设消息编号赋予函数给所述JS消息赋予JS消息编号,并通过所述消息传输函数将所述JS消息和所述JS消息编号映射存储至回调管理器。
进一步地,从所述回调管理器中捕获所述JS消息,并对所述JS消息进行解析,得到原生应用参数的步骤包括:
通过预设回调函数从所述回调管理器中获取JS消息编号,并通过所述JS消息编号从所述回调管理器中捕获对应的JS消息,且对所述JS消息进行解析,得到原生应用参数。
进一步地,所述桥接通信方法还包括:
在得到原生应用参数之后,获取包装有线程捕获函数的预设代码块,并通过所述预设代码块中的线程捕获函数捕获JavaScript所在的执行线程;
将所述原生应用参数派发至所述执行线程,并通过所述执行线程将所述原生应用参数回调至JavaScript。
此外,为实现上述目的,本发明还提供一种桥接通信装置,所述桥接通信装置包括:
桥接选择模块,用于当监测到直译式脚本语言JS代码文件时,根据桥接框架接收到的字段确定目标容器标签,并依据所述目标容器标签选择对应的目标桥接策略;
参数捕获模块,用于当所述目标桥接策略为第一预设桥接策略时,从所述JS代码文件中捕获调用的JS函数的参数;
参数转换模块,用于将所述参数转换为对应的原生应用参数;
映射模块,用于当所述目标桥接策略为第二预设桥接策略时,则将所述JS代码文件中调用的JS函数的JS消息映射至回调管理器;
回调模块,用于从所述回调管理器中捕获所述JS消息,并对所述JS消息进行解析,得到原生应用参数。
进一步地,所述桥接选择模块还用于:
根据桥接框架接收到的字段,判断所述字段是处于第一容器标签对应的字段,还是处于第二容器标签对应的字段;
若所述字段处于第一容器标签对应的字段,则将所述第一容器标签确定为目标容器标签;
若所述字段处于第二容器标签对应的字段,则将所述第二容器标签确定为目标容器标签。
进一步地,所述映射模块还用于:
从所述JS代码文件中获取调用的JS函数的JS消息和预设桥接对象的消息传输函数;
通过预设消息编号赋予函数给所述JS消息赋予JS消息编号,并通过所述消息传输函数将所述JS消息和所述JS消息编号映射存储至回调管理器。
进一步地,所述桥接通信装置还包括:
获取模块,用于在得到原生应用参数之后,获取包装有线程捕获函数的预设代码块;
线程捕获模块,用于通过所述预设代码块中的线程捕获函数捕获JavaScript所在的执行线程;
派发回调模块,用于将所述原生应用参数派发至所述执行线程,并通过所述执行线程将所述原生应用参数回调至JavaScript。
此外,为实现上述目的,本发明还提供一种桥接通信设备,所述桥接通信设备包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的桥接通信程序,所述桥接通信程序被所述处理器执行时实现如上所述的桥接通信方法的步骤。
本发明还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有桥接通信程序,所述桥接通信程序被处理器执行时实现如上所述的桥接通信方法的步骤。
本发明提供一种桥接通信方法、装置、设备及计算机可读存储介质,本发明当监测到JS代码文件时,根据桥接框架接收到的字段确定目标容器标签,并依据该目标容器标签选择对应的目标桥接策略,当该目标桥接策略为第一预设桥接策略时,从JS代码文件中捕获调用的JS函数的参数,并将参数转换为对应的原生应用参数,而当目标桥接策略为第二预设桥接策略时,将JS代码文件中调用的JS函数的JS消息映射至回调管理器,并从回调管理器中捕获JS消息,并对JS消息进行解析,得到原生应用参数,通过桥接框架接收到的字段,可以确定对应容器的桥接方式,然后通过该桥接方式执行JS代码文件,实现web容器与原生应用之间的通信,桥接方式并不是基于假跳转请求实现的,因此,不存在web容器与原生应用之间无法通信的问题,也不存在桥接通信的内容有限制的问题,有效的提高了web容器与原生应用之间的通信有效性。
附图说明
图1是本发明实施例方案涉及的硬件运行环境的设备结构示意图;
图2为本发明桥接通信方法一实施例的流程示意图;
图3为本发明桥接通信装置一实施例的功能模块示意图。
本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
如图1所示,图1是本发明实施例方案涉及的硬件运行环境的设备结构示意图。
如图1所示,该桥接通信设备可以包括:处理器1001,例如CPU,通信总线1002,用户接口1003,网络接口1004,存储器1005。其中,通信总线1002用于实现这些组件之间的连接通信。用户接口1003可以包括显示屏(Display)、输入单元比如键盘(Keyboard),可选的用户接口1003还可以包括标准的有线接口、无线接口。网络接口1004可选的可以包括标准的有线接口、无线接口(如WI-FI接口)。存储器1005可以是高速RAM存储器,也可以是稳定的存储器(non-volatile memory),例如磁盘存储器。存储器1005可选的还可以是独立于前述处理器1001的存储装置。
本领域技术人员可以理解,图1中示出的桥接通信设备结构并不构成对桥接通信设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
如图1所示,作为一种计算机存储介质的存储器1005中可以包括操作系统、网络通信模块、用户接口模块以及桥接通信程序。
在图1所示的桥接通信设备中,网络接口1004主要用于连接后台服务器,与后台服务器进行数据通信;用户接口1003主要用于连接客户端(用户端),与客户端进行数据通信;而处理器1001可以用于调用存储器1005中存储的桥接通信程序,并执行以下步骤:
当监测到直译式脚本语言JS代码文件时,根据桥接框架接收到的字段确定目标容器标签,并依据所述目标容器标签选择对应的目标桥接策略;
当所述目标桥接策略为第一预设桥接策略时,从所述JS代码文件中捕获调用的JS函数的参数,并将所述参数转换为对应的原生应用参数;
当所述目标桥接策略为第二预设桥接策略时,将所述JS代码文件中调用的JS函数的JS消息映射至回调管理器;
从所述回调管理器中捕获所述JS消息,并对所述JS消息进行解析,得到原生应用参数。
进一步地,处理器1001可以用于调用存储器1005中存储的桥接通信程序,还执行以下步骤:
根据桥接框架接收到的字段,判断所述字段是处于第一容器标签对应的字段,还是处于第二容器标签对应的字段;
若所述字段处于第一容器标签对应的字段,则将所述第一容器标签确定为目标容器标签;
若所述字段处于第二容器标签对应的字段,则将所述第二容器标签确定为目标容器标签。
进一步地,处理器1001可以用于调用存储器1005中存储的桥接通信程序,还执行以下步骤:
从所述JS代码文件中获取调用的JS函数的JS消息和预设桥接对象的消息传输函数;
通过预设消息编号赋予函数给所述JS消息赋予JS消息编号,并通过所述消息传输函数将所述JS消息和所述JS消息编号映射存储至回调管理器。
进一步地,处理器1001可以用于调用存储器1005中存储的桥接通信程序,还执行以下步骤:
通过预设回调函数从所述回调管理器中获取JS消息编号,并通过所述JS消息编号从所述回调管理器中捕获对应的JS消息,且对所述JS消息进行解析,得到原生应用参数。
进一步地,处理器1001可以用于调用存储器1005中存储的桥接通信程序,还执行以下步骤:
在得到原生应用参数之后,获取包装有线程捕获函数的预设代码块,并通过所述预设代码块中的线程捕获函数捕获JavaScript所在的执行线程;
将所述原生应用参数派发至所述执行线程,并通过所述执行线程将所述原生应用参数回调至JavaScript。
其中,本发明桥接通信设备的具体实施例与下述桥接通信方法的各具体实施例基本相同,在此不作赘述。
本发明提供一种桥接通信方法。
参照图2,图2为本发明桥接通信方法一实施例的流程示意图。
步骤S101,当监测到直译式脚本语言JS代码文件时,根据桥接框架接收到的字段确定目标容器标签,并依据所述目标容器标签选择对应的目标桥接策略;
本实施例中,该桥接通信方法应用于桥接通信设备,当监测到JS(JavaScript,直译式脚本语言)代码文件时,该桥接通信设备根据桥接框架接收到的字段(该字段可选是用户输入的,也可选是用户选择UIWebView容器或WKWebView容器后塞入所述桥接框架的),确定目标容器标签,并依据该目标容器标签选择对应的目标桥接策略。具体地,该桥接通信设备根据桥接框架接收到的字段,判断该字段是处于第一容器标签对应的字段,还是处于第二容器标签对应的字段,如果该字段处于第一容器标签对应的字段,则将第一容器标签确定为目标容器标签,如果该字段处于第二容器标签对应的字段,则将第二容器标签确定为目标容器标签。
其中,第一容器标签为UIwebView容器对应的容器标签,第二容器标签为WKwebView容器对应的容器标签,具体实施中,针对UIwebView容器,原生应用的开发人员在桥接框架中注册供web应用调用的JS方法的函数名,以供预设参数捕获函数基于所述函数名捕获所述JS方法(即JS函数)的参数,再由预设参数转换函数将所述参数转化为对应的原生应用参数。针对WKwebView容器,原生应用的开发人员在桥接框架中注册桥接对象和供web应用调用的JS方法,以供预设桥接对象的消息传输函数将所述JS方法(JS消息)发送至回调管理器,由原生的预设回调函数从所述回调管理器中捕获JS消息进行解析,以得到原生应用参数。该UIwebView容器和该WKwebView容器用于在web应用中嵌入网页内容。其中,如果目标容器标签为第一容器标签,则目标桥接策略为第一预设桥接策略,而如果目标容器标签为第二容器标签,则目标桥接策略为第二预设桥接策略,该第一预设桥接策略以JavaScriptCore为UIwebView容器与原生应用的桥接通信基础,该第二预设桥接策略以WKScriptMessageHandler为WKwebView容器与原生应用的桥接通信基础。
步骤S102,当所述目标桥接策略为第一预设桥接策略时,从所述JS代码文件中捕获调用的JS函数的参数,并将所述参数转换为对应的原生应用参数;
本实施例中,当该目标桥接策略为第一预设桥接策略时,该桥接通信设备可选通过预设参数捕获函数从该JS代码文件中捕获调用的JS函数的参数,并通过预设参数转换函数将该参数转换为对应的原生应用参数。其中,该预设参数捕获函数为JSContext的currentArguments,该预设参数转换函数为toString、toBool和toDictionary中的一种,该参数的类型为JSValue,该JSContext是JavaScript的执行环境,JSValue代表一个JavaScript实体,一个JSValue可以表示很多JavaScript原始类型数据,包括但不限于布尔类型数据、整形数据、浮点型数据、字符串数据、对象数据和函数。此外,当所述目标桥接策略为第一预设桥接策略时,还可选通过编写的第一脚本程序段从所述JS代码文件中捕获调用的JS函数的参数,并将所述参数转换为对应的原生应用参数。
步骤S103,当所述目标桥接策略为第二预设桥接策略时,将所述JS代码文件中调用的JS函数的JS消息映射至回调管理器;
本实施例中,当该目标桥接策略为第二预设桥接策略时,该桥接通信设备通可选过该JS代码文件中预设桥接对象的消息传输函数将该JS代码文件中调用的JS函数的JS消息映射至回调管理器,具体地,从该JS代码文件中获取调用的JS函数的JS消息和预设桥接对象的消息传输函数,然后通过预设消息编号赋予函数给该JS消息赋予JS消息编号,并通过该消息传输函数将该JS消息和该JS消息编号映射存储至回调管理器。其中,该JS消息与该JS消息编号一一对应,预设桥接对象根据实际需要设置,此处不做限定,该消息传输函数为postMessage,需要说明的是,上述预设消息编号赋予函数可由本领域技术人员基于实际情况进行设置,本实施例对此不作具体限定。此外,当所述目标桥接策略为第二预设桥接策略时,还可选通过编写的第二脚本程序段将所述JS代码文件中调用的JS函数的JS消息映射至回调管理器。
步骤S104,从所述回调管理器中捕获所述JS消息,并对所述JS消息进行解析,得到原生应用参数。
本实施例中,将JS消息映射至回调管理器之后,该桥接通信设备通过预设回调函数从回调管理器中捕获JS消息,并对JS消息进行解析,得到原生应用参数。具体地,通过预设回调函数从回调管理器中获取JS消息编号,并通过该JS消息编号从该回调管理器中捕获对应的JS消息,且对该JS消息进行解析,得到原生应用参数。其中,该原生参数为该JS消息中JS方法的参数对应的Objective-C值或对象,该回调管理器存储有JS消息,该预设回调函数为:(void)userContentController:(WKUserContentController*)userContentController didReceiveScriptMessage:(WKScriptMessage*)message。例如,开发人员在桥接框架中注册名称为XDWKJ的桥接对象和供web应用调用的JS方法,开发人员编写包含有调用的JS方法的JS软件代码,运行该JS软件代码通过该桥接对象的postMessage函数将该JS方法的JS消息(JS方法的函数名和参数)映射存储至回调管理器,然后通过预设回调函数从回调管理器中捕获与解析对应的JS消息,得到原生应用参数。
需要说明的是,可以通过编写第三脚本程序段的方式从回调管理器中捕获该JS消息,并对该JS消息进行解析,得到原生应用参数。
在本实施例中,引入一定JS代码,因为WKwebView容器提供的JS交互只支持简单的数据传输,当存在回调的时候,当前的交互并不能将JS的回调完美转化。所以需要设计一个JS的回调管理器用于保存从JS的回调,在JS层先赋予回调一个id(JS消息编号)并映射起来,因为id可以设计为简单的数据格式,如字符串,所以原生这边很容易捕获和解析,当原生回调数据时通过回调管理器获取对应id的回调,执行对应回调的JS代码就可以实现桥接回调。
为更好理解本实施例中,举例如下:
首先开发人员在桥接框架中注册一个桥接对象和一些供web应用调用的原生方法,开发人员编写包含有调用的JS方法的JS软件代码,该JS软件代码中包含该JS方法的JS消息,该JS消息包含一个字段type,该字段的值是camera,然后运行该JS软件代码通过该桥接对象的postMessage函数将该JS消息发送到原生应用,原生应用的桥接框架捕获到JS消息,解析为原生应用的字典类型,取出type的值,判断camera有没有在注册的原生方法里,假如注册一个camera的方法调起原生相机,这时就会调起相机。
本实施例中,本发明当监测到JS代码文件时,根据桥接框架接收到的字段确定目标容器标签,并依据该目标容器标签选择对应的目标桥接策略,当该目标桥接策略为第一预设桥接策略时,从JS代码文件中捕获调用的JS函数的参数,并将参数转换为对应的原生应用参数,而当目标桥接策略为第二预设桥接策略时,将JS代码文件中调用的JS函数的JS消息映射至回调管理器,并从回调管理器中捕获JS消息,并对JS消息进行解析,得到原生应用参数,通过桥接框架接收到的字段,可以确定对应容器的桥接方式,然后通过该桥接方式执行JS代码文件,实现web容器与原生应用之间的通信,桥接方式并不是基于假跳转请求实现的,因此,不存在web容器与原生应用之间无法通信的问题,也不存在桥接通信的内容有限制的问题,有效的提高了web容器与原生应用之间的通信有效性。
进一步地,基于上述一实施例,提出了本发明桥接通信方法的另一实施例,与前述实施例的区别在于,在得到原生应用参数之后,该桥接通信设备获取包装有线程捕获函数的预设代码块,并通过该预设代码块中的线程捕获函数捕获JavaScript所在的执行线程,然后通过预设多线程框架将该原生应用参数派发至该执行线程,并通过该执行线程将该原生应用参数回调至JavaScript。其中,预设多线程框架为GCD(Grand Central Dispatch,多线程调度中心),该预设代码块由开发人员基于实际情况进行设置,本实施例对此不作具体限定。
本实施例中,本发明在得到原生应用参数之后,捕获JavaScript所在的执行线程,并将该原生应用参数派发至该执行线程,然后通过该执行线程将该原生应用参数回调至JavaScript,使得JavaScript的回调和执行始终在同一个线程,不需要切换线程,从而有效的解决了由于线程切换导致的偶现奔溃问题。
本发明还提供一种桥接通信装置。
参照图3,图3为本发明桥接通信装置一实施例的功能模块示意图。
本实施例中,该桥接通信装置包括:
桥接选择模块101,用于当监测到直译式脚本语言JS代码文件时,根据桥接框架接收到的字段确定目标容器标签,并依据所述目标容器标签选择对应的目标桥接策略;
本实施例中,当监测到JS(JavaScript,直译式脚本语言)代码文件时,桥接选择模块101根据桥接框架接收到的字段(该字段可选是用户输入的,也可选是用户选择UIWebView容器或WKWebView容器后塞入所述桥接框架的),确定目标容器标签,并依据该目标容器标签选择对应的目标桥接策略。具体地,该桥接通信设备根据桥接框架接收到的字段,判断该字段是处于第一容器标签对应的字段,还是处于第二容器标签对应的字段,如果该字段处于第一容器标签对应的字段,则将第一容器标签确定为目标容器标签,如果该字段处于第二容器标签对应的字段,则将第二容器标签确定为目标容器标签。
其中,第一容器标签为UIwebView容器对应的容器标签,第二容器标签为WKwebView容器对应的容器标签,具体实施中,针对UIwebView容器,原生应用的开发人员在桥接框架中注册供web应用调用的JS方法的函数名,以供预设参数捕获函数基于所述函数名捕获所述JS方法(即JS函数)的参数,再由预设参数转换函数将所述参数转化为对应的原生应用参数。针对WKwebView容器,原生应用的开发人员在桥接框架中注册桥接对象和供web应用调用的JS方法的函数名,以供预设桥接对象的消息传输函数将所述JS方法(JS消息)发送至回调管理器,由原生的预设回调函数从所述回调管理器中捕获JS消息进行解析,以得到原生应用参数。该UIwebView容器和该WKwebView容器用于在web应用中嵌入网页内容。
其中,如果目标容器标签为第一容器标签,则目标桥接策略为第一预设桥接策略,而如果目标容器标签为第二容器标签,则目标桥接策略为第二预设桥接策略,该第一预设桥接策略以JavaScriptCore为UIwebView容器与原生应用的桥接通信基础,该第二预设桥接策略以WKScriptMessageHandler为WKwebView容器与原生应用的桥接通信基础。
参数捕获模块102,用于当所述目标桥接策略为第一预设桥接策略时,从所述JS代码文件中捕获调用的JS函数的参数;
参数转换模块103,用于将所述参数转换为对应的原生应用参数;
本实施例中,当该目标桥接策略为第一预设桥接策略时,该参数捕获模块102可选通过预设参数捕获函数从该JS代码文件中捕获调用的JS函数的参数,该参数转换模块103通过预设参数转换函数将该参数转换为对应的原生应用参数。其中,该预设参数捕获函数为JSContext的currentArguments,该预设参数转换函数为toString、toBool和toDictionary中的一种,该参数的类型为JSValue,该JSContext是JavaScript的执行环境,JSValue代表一个JavaScript实体,一个JSValue可以表示很多JavaScript原始类型数据,包括但不限于布尔类型数据、整形数据、浮点型数据、字符串数据、对象数据和函数。此外,当所述目标桥接策略为第一预设桥接策略时,还可选通过编写的第一脚本程序段从所述JS代码文件中捕获调用的JS函数的参数,并将所述参数转换为对应的原生应用参数。
映射模块104,用于当所述目标桥接策略为第二预设桥接策略时,则将所述JS代码文件中调用的JS函数的JS消息映射至回调管理器;
本实施例中,当该目标桥接策略为第二预设桥接策略时,该参数转换模块103可选通过该JS代码文件中预设桥接对象的消息传输函数将该JS代码文件中调用的JS函数的JS消息映射至回调管理器,具体地,从该JS代码文件中获取调用的JS函数的JS消息和预设桥接对象的消息传输函数,然后通过预设消息编号赋予函数给该JS消息赋予JS消息编号,并通过该消息传输函数将该JS消息和该JS消息编号映射存储至回调管理器。其中,该JS消息与该JS消息编号一一对应,预设桥接对象根据实际需要设置,此处不做限定,该消息传输函数为postMessage,需要说明的是,上述预设消息编号赋予函数可由本领域技术人员基于实际情况进行设置,本实施例对此不作具体限定。此外,当所述目标桥接策略为第二预设桥接策略时,还可选通过编写的第二脚本程序段将所述JS代码文件中调用的JS函数的JS消息映射至回调管理器。
回调模块105,用于从所述回调管理器中捕获所述JS消息,并对所述JS消息进行解析,得到原生应用参数。
本实施例中,将JS消息映射至回调管理器之后,回调模块105通过预设回调函数从回调管理器中捕获JS消息,并对JS消息进行解析,得到原生应用参数。具体地,通过预设回调函数从回调管理器中获取JS消息编号,并通过该JS消息编号从该回调管理器中捕获对应的JS消息,且对该JS消息进行解析,得到原生应用参数。其中,该原生参数为该JS消息中JS方法的参数对应的Objective-C值或对象,该回调管理器存储有JS消息,该预设回调函数为:(void)userContentController:(WKUserContentController*)userContentController didReceiveScriptMessage:(WKScriptMessage*)message。例如,开发人员在桥接框架中注册名称为XDWKJ的桥接对象和供web应用调用的JS方法,开发人员编写包含有调用的JS方法的JS软件代码,运行该JS软件代码通过该桥接对象的postMessage函数将该JS方法的JS消息(JS方法的函数名和参数)映射存储至回调管理器,然后通过预设回调函数从回调管理器中捕获与解析对应的JS消息,得到原生应用参数。
需要说明的是,可以通过编写第三脚本程序段的方式从回调管理器中捕获该JS消息,并对该JS消息进行解析,得到原生应用参数。
在本实施例中,引入一定JS代码,因为WKwebView容器提供的JS交互只支持简单的数据传输,当存在回调的时候,当前的交互并不能将JS的回调完美转化。所以需要设计一个JS的回调管理器用于保存从JS的回调,在JS层先赋予回调一个id(JS消息编号)并映射起来,因为id可以设计为简单的数据格式,如字符串,所以原生这边很容易捕获和解析,当原生回调数据时通过回调管理器获取对应id的回调,执行对应回调的JS代码就可以实现桥接回调。
为更好理解本实施例中,举例如下:
首先开发人员在桥接框架中注册一个桥接对象和一些供web应用调用的原生方法,开发人员编写包含有调用的JS方法的JS软件代码,该JS软件代码中包含该JS方法的JS消息,该JS消息包含一个字段type,该字段的值是camera,然后运行该JS软件代码通过该桥接对象的postMessage函数将该JS消息发送到原生应用,原生应用的桥接框架捕获到JS消息,解析为原生应用的字典类型,取出type的值,判断camera有没有在注册的原生方法里,假如注册一个camera的方法调起原生相机,这时就会调起相机。
本实施例中,本发明通过桥接框架接收到的字段,可以确定对应容器的桥接方式,然后通过该桥接方式执行JS代码文件,实现web容器与原生应用之间的通信,桥接方式并不是基于假跳转请求实现的,因此,不存在web容器与原生应用之间无法通信的问题,也不存在桥接通信的内容有限制的问题,有效的提高了web容器与原生应用之间的通信有效性。
进一步地,基于上述一实施例,提出了本发明桥接通信装置的另一实施例,与前述实施例的区别在于,该桥接通信装置还包括:
获取模块,用于在得到原生应用参数之后,获取包装有线程捕获函数的预设代码块;
线程捕获模块,用于通过所述预设代码块中的线程捕获函数捕获JavaScript所在的执行线程;
派发回调模块,用于将所述原生应用参数派发至所述执行线程,并通过所述执行线程将所述原生应用参数回调至JavaScript。
本实施例中,在得到原生应用参数之后,通过获取模块获取包装有线程捕获函数的预设代码块,并通过该预设代码块中的线程捕获函数捕获JavaScript所在的执行线程,然后通过预设多线程框架将该原生应用参数派发至该执行线程,并通过该执行线程将该原生应用参数回调至JavaScript。其中,预设多线程框架为GCD(Grand Central Dispatch,多线程调度中心),该预设代码块由开发人员基于实际情况进行设置,本实施例对此不作具体限定。
本实施例中,本发明在得到原生应用参数之后,捕获JavaScript所在的执行线程,并将该原生应用参数派发至该执行线程,然后通过该执行线程将该原生应用参数回调至JavaScript,使得JavaScript的回调和执行始终在同一个线程,不需要切换线程,从而有效的解决了由于线程切换导致的偶现奔溃问题。
此外,本发明实施例还提出一种计算机可读存储介质,所述计算机可读存储介质上存储有桥接通信程序,所述桥接通信程序被处理器执行时,执行以下步骤:
当监测到直译式脚本语言JS代码文件时,根据桥接框架接收到的字段确定目标容器标签,并依据所述目标容器标签选择对应的目标桥接策略;
当所述目标桥接策略为第一预设桥接策略时,从所述JS代码文件中捕获调用的JS函数的参数,并将所述参数转换为对应的原生应用参数;
当所述目标桥接策略为第二预设桥接策略时,将所述JS代码文件中调用的JS函数的JS消息映射至回调管理器;
从所述回调管理器中捕获所述JS消息,并对所述JS消息进行解析,得到原生应用参数。
进一步地,所述桥接通信程序被处理器执行时,还执行以下步骤:
根据桥接框架接收到的字段,判断所述字段是处于第一容器标签对应的字段,还是处于第二容器标签对应的字段;
若所述字段处于第一容器标签对应的字段,则将所述第一容器标签确定为目标容器标签;
若所述字段处于第二容器标签对应的字段,则将所述第二容器标签确定为目标容器标签。
进一步地,所述桥接通信程序被处理器执行时,还执行以下步骤:
从所述JS代码文件中获取调用的JS函数的JS消息和预设桥接对象的消息传输函数;
通过预设消息编号赋予函数给所述JS消息赋予JS消息编号,并通过所述消息传输函数将所述JS消息和所述JS消息编号映射存储至回调管理器。
进一步地,所述桥接通信程序被处理器执行时,还执行以下步骤:
通过预设回调函数从所述回调管理器中获取JS消息编号,并通过所述JS消息编号从所述回调管理器中捕获对应的JS消息,且对所述JS消息进行解析,得到原生应用参数。
进一步地,所述桥接通信程序被处理器执行时,还执行以下步骤:
在得到原生应用参数之后,获取包装有线程捕获函数的预设代码块,并通过所述预设代码块中的线程捕获函数捕获JavaScript所在的执行线程;
将所述原生应用参数派发至所述执行线程,并通过所述执行线程将所述原生应用参数回调至JavaScript。
本发明计算机可读存储介质的具体实施例与上述桥接通信方法各实施例基本相同,在此不作赘述。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者系统中还存在另外的相同要素。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在如上所述的一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。
Claims (8)
1.一种桥接通信方法,其特征在于,所述桥接通信方法包括以下步骤:
当监测到直译式脚本语言JS代码文件时,根据桥接框架接收到的字段确定目标容器标签,并依据所述目标容器标签选择对应的目标桥接策略;
当所述目标桥接策略为第一预设桥接策略时,通过预设参数捕获函数从所述JS代码文件中捕获调用的JS函数的参数,并通过预设参数转换函数将所述参数转换为对应的原生应用参数,所述预设参数捕获函数为JSContext的currentArguments,所述预设参数转换函数为toString、toBool和toDictionary中的一种;
当所述目标桥接策略为第二预设桥接策略时,将所述JS代码文件中调用的JS函数的JS消息映射至回调管理器;
从所述回调管理器中捕获所述JS消息,并对所述JS消息进行解析,得到原生应用参数;
所述桥接通信方法还包括:
在得到原生应用参数之后,获取包装有线程捕获函数的预设代码块,并通过所述预设代码块中的线程捕获函数捕获JavaScript所在的执行线程;
将所述原生应用参数派发至所述执行线程,并通过所述执行线程将所述原生应用参数回调至JavaScript。
2.如权利要求1所述的桥接通信方法,其特征在于,根据桥接框架接收到的字段确定目标容器标签的步骤包括:
根据桥接框架接收到的字段,判断所述字段是处于第一容器标签对应的字段,还是处于第二容器标签对应的字段;
若所述字段处于第一容器标签对应的字段,则将所述第一容器标签确定为目标容器标签;
若所述字段处于第二容器标签对应的字段,则将所述第二容器标签确定为目标容器标签。
3.如权利要求1或2所述的桥接通信方法,其特征在于,将所述JS代码文件中调用的JS函数的JS消息映射至回调管理器的步骤包括:
从所述JS代码文件中获取调用的JS函数的JS消息和预设桥接对象的消息传输函数;
通过预设消息编号赋予函数给所述JS消息赋予JS消息编号,并通过所述消息传输函数将所述JS消息和所述JS消息编号映射存储至回调管理器;
从所述回调管理器中捕获所述JS消息,并对所述JS消息进行解析,得到原生应用参数的步骤包括:
通过预设回调函数从所述回调管理器中获取JS消息编号,并通过所述JS消息编号从所述回调管理器中捕获对应的JS消息,且对所述JS消息进行解析,得到原生应用参数;
其中,所述JS消息包括所述JS函数的参数。
4.一种桥接通信装置,其特征在于,所述桥接通信装置包括:
桥接选择模块,用于当监测到直译式脚本语言JS代码文件时,根据桥接框架接收到的字段确定目标容器标签,并依据所述目标容器标签选择对应的目标桥接策略;
参数捕获模块,用于当所述目标桥接策略为第一预设桥接策略时,从所述JS代码文件中捕获调用的JS函数的参数;
参数转换模块,用于将所述参数转换为对应的原生应用参数;
映射模块,用于当所述目标桥接策略为第二预设桥接策略时,则将所述JS代码文件中调用的JS函数的JS消息映射至回调管理器;
回调模块,用于从所述回调管理器中捕获所述JS消息,并对所述JS消息进行解析,得到原生应用参数;
所述桥接通信装置还包括:
获取模块,用于在得到原生应用参数之后,获取包装有线程捕获函数的预设代码块;
线程捕获模块,用于通过所述预设代码块中的线程捕获函数捕获JavaScript所在的执行线程;
派发回调模块,用于将所述原生应用参数派发至所述执行线程,并通过所述执行线程将所述原生应用参数回调至JavaScript。
5.如权利要求4所述的桥接通信装置,其特征在于,所述桥接选择模块还用于:
根据桥接框架接收到的字段,判断所述字段是处于第一容器标签对应的字段,还是处于第二容器标签对应的字段;
若所述字段处于第一容器标签对应的字段,则将所述第一容器标签确定为目标容器标签;
若所述字段处于第二容器标签对应的字段,则将所述第二容器标签确定为目标容器标签。
6.如权利要求4或5所述的桥接通信装置,其特征在于,所述桥接通信装置还包括:
获取模块,用于在得到原生应用参数之后,获取包装有线程捕获函数的预设代码块;
线程捕获模块,用于通过所述预设代码块中的线程捕获函数捕获JavaScript所在的执行线程;
派发回调模块,用于将所述原生应用参数派发至所述执行线程,并通过所述执行线程将所述原生应用参数回调至JavaScript。
7.一种桥接通信设备,其特征在于,所述桥接通信设备包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的桥接通信程序,所述桥接通信程序被所述处理器执行时实现如权利要求1至3中任一项所述的桥接通信方法的步骤。
8.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有桥接通信程序,所述桥接通信程序被处理器执行时实现如权利要求1至3中任一项所述的桥接通信方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811566923.8A CN109857515B (zh) | 2018-12-20 | 2018-12-20 | 桥接通信方法、装置、设备及计算机可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811566923.8A CN109857515B (zh) | 2018-12-20 | 2018-12-20 | 桥接通信方法、装置、设备及计算机可读存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109857515A CN109857515A (zh) | 2019-06-07 |
CN109857515B true CN109857515B (zh) | 2023-07-18 |
Family
ID=66891629
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811566923.8A Active CN109857515B (zh) | 2018-12-20 | 2018-12-20 | 桥接通信方法、装置、设备及计算机可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109857515B (zh) |
Families Citing this family (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110502708B (zh) * | 2019-08-27 | 2020-10-30 | 北京达佳互联信息技术有限公司 | 基于JSBridge进行通信的方法、装置及存储介质 |
CN112988125B (zh) * | 2019-12-02 | 2023-09-12 | 广州铭诚计算机科技有限公司 | 一种数据桥接方法、装置、设备和存储介质 |
CN113360200A (zh) * | 2020-03-05 | 2021-09-07 | 北京沃东天骏信息技术有限公司 | 一种目标程序植入页面运行的方法和装置 |
CN111443946B (zh) * | 2020-03-09 | 2024-03-15 | 深圳市伊欧乐科技有限公司 | Ios系统与页面的交互方法、系统、服务器和存储介质 |
CN112035097B (zh) * | 2020-08-25 | 2023-10-13 | 华东计算技术研究所(中国电子科技集团公司第三十二研究所) | 基于银河锐华操作系统的c++适配层的装置 |
CN112416466B (zh) * | 2020-12-02 | 2024-02-23 | 车智互联(北京)科技有限公司 | 一种应用程序加载方法、移动终端及可读存储介质 |
CN113037814B (zh) * | 2021-02-25 | 2022-11-25 | 平安壹钱包电子商务有限公司 | Web容器注入的实现方法、装置、计算机设备及存储介质 |
CN113076151B (zh) * | 2021-04-21 | 2023-10-10 | 光禹莱特数字科技(上海)有限公司 | 应用程序交互方法、装置、计算机设备及存储介质 |
CN113204393A (zh) * | 2021-04-25 | 2021-08-03 | 随锐科技集团股份有限公司 | 原生与js交互的消息处理方法 |
CN113626321B (zh) * | 2021-07-29 | 2024-03-19 | 北京达佳互联信息技术有限公司 | 桥接测试方法、装置、系统及存储介质 |
CN115065674B (zh) * | 2022-08-03 | 2023-03-24 | 北京金堤科技有限公司 | 一种通信方法及装置 |
CN115514611B (zh) * | 2022-09-21 | 2023-07-28 | 杭州网易再顾科技有限公司 | 消息处理方法、装置、设备及存储介质 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8819698B2 (en) * | 2012-04-02 | 2014-08-26 | Hewlett-Packard Development Company, L. P. | Cross-platform web-based native device feature access |
CN108021583B (zh) * | 2016-10-28 | 2022-05-06 | 阿里巴巴集团控股有限公司 | 页面加载方法及客户端 |
-
2018
- 2018-12-20 CN CN201811566923.8A patent/CN109857515B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN109857515A (zh) | 2019-06-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109857515B (zh) | 桥接通信方法、装置、设备及计算机可读存储介质 | |
CN107818023B (zh) | 基于线程的消息处理方法、智能设备及存储介质 | |
CN110941950A (zh) | 接口文档的生成方法、装置、服务器及存储介质 | |
JP2016540333A (ja) | 端末標記方法、端末標記装置、プログラム及び記録媒体 | |
CN108694120B (zh) | 测试服务组件的方法和装置 | |
CN113419729A (zh) | 基于组件化的前端页面搭建方法、装置、设备及存储介质 | |
CN110825383B (zh) | 一种视频交互方法、装置及计算机可读存储介质 | |
CN106933623B (zh) | 免安装应用的运行方法、装置及系统 | |
CN106454403B (zh) | 数据显示方法、设备及系统 | |
US9285869B2 (en) | System, method and computer readable medium for invoking applications | |
CN111090580A (zh) | 用户界面一致性检测方法、装置及可读存储介质 | |
CN110493250A (zh) | 一种web前端arcgis资源请求处理方法及装置 | |
CN113094138A (zh) | 界面显示方法、装置、电子设备及存储介质 | |
CN113760283A (zh) | 一种文本渲染方法和装置 | |
CN109213512A (zh) | 离线包加载方法、系统、终端及可读存储介质 | |
CN112965732A (zh) | 资源包的获取方法、智能穿戴设备及存储介质 | |
CN109240673B (zh) | 一种基于react-native的视图动态加载更新方法及系统 | |
CN113761412A (zh) | 应用页面的显示方法、装置、电子设备、介质及应用系统 | |
CN113495796A (zh) | 服务调用方法及相关设备 | |
CN114301970B (zh) | 服务调用方法、装置、电子设备及存储介质 | |
CN111338928A (zh) | 基于chrome浏览器测试的方法及装置 | |
CN111078571B (zh) | 模拟响应的测试方法、终端设备及计算机可读存储介质 | |
CN110209959B (zh) | 信息处理方法和装置 | |
CN114866628A (zh) | 一种报文处理的方法、装置、设备及存储介质 | |
WO2021146895A1 (zh) | 车载图像显示的优化方法、装置、计算机设备和存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |