CN110955430A - 应用程序原生能力的调用方法、装置及电子设备 - Google Patents
应用程序原生能力的调用方法、装置及电子设备 Download PDFInfo
- Publication number
- CN110955430A CN110955430A CN201811125281.8A CN201811125281A CN110955430A CN 110955430 A CN110955430 A CN 110955430A CN 201811125281 A CN201811125281 A CN 201811125281A CN 110955430 A CN110955430 A CN 110955430A
- Authority
- CN
- China
- Prior art keywords
- native
- calling
- context
- program
- language program
- 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.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/427—Parsing
Abstract
本发明实施例公开了一种应用程序原生能力的调用方法、装置及电子设备,方法包括:解析来自第一预定语言程序的参数,并创建第一预定语言程序调用原生能力的第一上下文;根据解析后的参数确定待调用的原生能力对应原生方法的名称,并通过第一上下文判断第一预定语言程序是否具有原生方法的调用权限;在第一预定语言程序具有调用权限的情况下,调用原生方法的实例,得到执行结果,并创建转化执行结果的第二上下文;根据第二上下文将执行结果转化为第一预定语言程序可执行的第一预定语言代码。本发明的调用过程简单,无论jsbridge方法如何增加,native端都按照上述简单的流程调用原生方法,耗时较短。
Description
技术领域
本发明涉及软件领域,特别涉及一种应用程序原生能力的调用方法、装置及电子设备。
背景技术
随着移动互联网的发展,移动终端的App(应用程序)开发逐渐兴盛,App开发普遍周期较长且依赖发版,无法满足互联网产品快速迭代的需求。面对这个问题,开发人员的普遍做法是在App中采取web(例如,html、css、javascript)与native(原生)开发相结合的模式(即hybrid开发模式)来满足需求。这就需要让web能够调用App的原生能力(如:拍照、存储、支付等)。
现有做法是提供一套jsbridge,即App内native端提供出调用原生能力的方法,web端通过js进行调用,使App的开发既满足快速迭代的需要,又能拥有原生能力。
现有管理和维护jsbridge时,通常都是用一个对象(以下假定为BridgeObject)来进行维护,所有提供给jsbridge的方法都作为BridgeObject的方法来实现,在调用原生能力时,都需要通过BridgeObject来实现。
在实现本发明的过程中,发明人发现现有技术至少存在以下缺陷:随着jsbridge方法数量日益增加,BridgeObject所依赖的东西越来越多,js调用native端原生能力的过程会越来越复杂,耗时较长,不利于js的调用。
发明内容
有鉴于此,本发明实施例提出了一种应用程序原生能力的调用方法、装置及电子设备,用以解决现有技术的如下问题:随着jsbridge方法数量日益增加,BridgeObject所依赖的东西越来越多,js调用native端原生能力的过程会越来越复杂,耗时较长,不利于js的调用。
一方面,本发明实施例提出了一种应用程序原生能力的调用方法,包括:解析来自第一预定语言程序的参数,并创建所述第一预定语言程序调用原生能力的第一上下文,其中,第一预定语言与应用程序的原生语言不同;根据解析后的参数确定待调用的原生能力对应原生方法的名称,并通过所述第一上下文判断所述第一预定语言程序是否具有所述原生方法的调用权限;在所述第一预定语言程序具有所述调用权限的情况下,调用所述原生方法的实例,得到执行结果,并创建转化所述执行结果的第二上下文;根据所述第二上下文将所述执行结果转化为所述第一预定语言程序可执行的第一预定语言代码。
另一方面,本发明实施例提出了一种应用程序原生能力的调用装置,包括:解析模块,用于解析来自第一预定语言程序的参数,并创建所述第一预定语言程序调用原生能力的第一上下文,其中,第一预定语言与应用程序的原生语言不同;鉴权模块,用于根据解析后的参数确定待调用的原生能力对应原生方法的名称,并通过所述第一上下文判断所述第一预定语言程序是否具有所述原生方法的调用权限;调用模块,用于在所述第一预定语言程序具有所述调用权限的情况下,调用所述原生方法的实例,得到执行结果,并创建转化所述执行结果的第二上下文;转化模块,用于根据所述第二上下文将所述执行结果转化为所述第一预定语言程序可执行的第一预定语言代码。
另一方面,本发明实施例提出了一种存储介质,存储有计算机程序,所述计算机程序被处理器执行时实现本发明任意实施例提供的方法。
另一方面,本发明实施例提出了一种电子设备,至少包括存储器、处理器,所述存储器上存储有计算机程序,所述处理器在执行所述存储器上的计算机程序时实现本发明任意实施例提供的方法。
本发明实施例在第一预定语言程序调用原生能力时,native端根据对应的参数和上下文调用原生能力对应的原生方法,执行原生方法的实例并得到执行结果,再将执行结果转化为第一预定语言代码,则第一预定语言就可以根据第一预定语言代码实现原生能力的调用了。本发明实施例的调用过程简单,无论jsbridge方法如何增加,native端都按照上述简单的流程调用原生方法,耗时较短。
附图说明
图1为本发明第一实施例提供的应用程序原生能力的调用方法的流程图;
图2为本发明第二实施例提供的应用程序原生能力的调用方法的流程图;
图3为本发明第三实施例提供的应用程序原生能力的调用装置的结构示意图;
图4为本发明第四实施例提供的应用程序原生能力的调用装置的结构示意图;
图5为本发明第五实施例提供的各个原生语言组件间的流程交互示意图;
图6为本发明第六实施例提供的电子设备的结构示意图。
具体实施方式
为了使得本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例的附图,对本发明实施例的技术方案进行清楚、完整地描述。显然,所描述的实施例是本发明的一部分实施例,而不是全部的实施例。基于所描述的本发明的实施例,本领域普通技术人员在无需创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
除非另外定义,本发明使用的技术术语或者科学术语应当为本发明所属领域内具有一般技能的人士所理解的通常意义。本发明中使用的“第一”、“第二”以及类似的词语并不表示任何顺序、数量或者重要性,而只是用来区分不同的组成部分。“包括”或者“包含”等类似的词语意指出现该词前面的元件或者物件涵盖出现在该词后面列举的元件或者物件及其等同,而不排除其他元件或者物件。“连接”或者“相连”等类似的词语并非限定于物理的或者机械的连接,而是可以包括电性的连接,不管是直接的还是间接的。“上”、“下”、“左”、“右”等仅用于表示相对位置关系,当被描述对象的绝对位置改变后,则该相对位置关系也可能相应地改变。
为了保持本发明实施例的以下说明清楚且简明,本发明省略了已知功能和已知部件的详细说明。
本发明第一实施例提供了一种应用程序原生能力的调用方法,该方法的流程如图1所示,包括步骤S101至S104:
S101,解析来自第一预定语言程序的参数,并创建第一预定语言程序调用原生能力的第一上下文,其中,第一预定语言与应用程序的原生语言不同。
由于是第一预定语言程序想要调用原生能力,因此,第一预定语言程序会向native端发送其想要调用的原生能力的参数,当native端接收到第一预定语言程序的参数时,就会对该参数进行解析。随后,创建第一上下文,以便native端运行过程中进行数据交互。
具体实现的过程中,本实施例的调用方法可以以单独封装的原生语言组件形式存在,该原生语言组件作为原生语言程序的一部分,负责第一预定语言程序调用方法过程中的管理工作。当然,也可以根据实际需要将一个原生语言组件分成多个原生语言组件分别进行封装。
S102,根据解析后的参数确定待调用的原生能力对应原生方法的名称,并通过第一上下文判断第一预定语言程序是否具有原生方法的调用权限。
当参数解析后,就可以进一步确定第一预定语言程序调用原生时要涉及到哪些具体的方法了,当知晓了具体方法的名称,就可以根据第一上下文来确定第一预定语言程序是否具有这些原生方法的调用权限了。
S103,在第一预定语言程序具有调用权限的情况下,调用原生方法的实例,得到执行结果,并创建转化执行结果的第二上下文。
每一个原生方法都需要对应到具体的实例来执行,因此,在第一预定语言程序具有调用权限的情况下,调用原生方法对应的实例来执行对应的操作,当得到执行结果后,就可以创建第二上下文进行进一步的数据交互了。
S104,根据第二上下文将执行结果转化为第一预定语言程序可执行的第一预定语言代码。
此时,native端已经调用原生方法得到了执行结果,将执行结果转化为第一预定语言程序可以执行的第一预定语言代码,则第一预定语言程序执行第一预定语言代码时,就可以实现原生能力的调用了。
本发明实施例在第一预定语言程序调用原生能力时,native端根据对应的参数和上下文调用原生能力对应的原生方法,执行原生方法的实例并得到执行结果,再将执行结果转化为第一预定语言代码,则第一预定语言就可以根据第一预定语言代码实现原生能力的调用了。本发明实施例的调用过程简单,无论jsbridge方法如何增加,native端都按照上述简单的流程调用原生方法,耗时较短。
本发明第二实施例提供了一种应用程序原生能力的调用方法,该方法的流程如图2所示,包括步骤S201至S208:
S201,将接收到的第一预定语言程序具有调用权限的所有原生能力对应原生方法的名称和实例进行注册。
该过程为基础过程,当将原生能力对应原生方法的名称和实例进行注册后,就不需要采用注解的方式运行程序时进行收集,有助于处理速度的提升和jsbridge的维护。
S202,确定具有调用原生能力可能性的所有网页视图,并为所有网页视图分别创建宿主环境、生成宿主环境对应的宿主ID和为宿主环境设置对应的代理。
该过程中,分别为有可能调用原生能力的网页视图创建了宿主环境,并为宿主环境设置了代理和生成了对应的宿主ID;在网页视图想要调用原生能力的时候,实际上就可以通过代理执行相应的过程,并在宿主环境中执行调用原生能力的过程。上述设置完成后,在可以不直接通过map映射或枚举的方式处理各个封装好的组件间的数据转发和处理,执行效果更好。
S203,解析来自第一预定语言程序的参数,并创建第一预定语言程序调用原生能力的第一上下文,其中,第一预定语言与应用程序的原生语言不同。
由于是第一预定语言程序想要调用原生能力,因此,第一预定语言程序会向native端发送其想要调用的原生能力的参数,当native端接收到第一预定语言程序的参数时,就会对该参数进行解析。随后,创建第一上下文,以便native端运行过程中进行数据交互。
具体实现的过程中,本实施例的调用方法可以以单独封装的原生语言组件形式存在,该原生语言组件作为原生语言程序的一部分,负责第一预定语言程序调用方法过程中的管理工作。当然,也可以根据实际需要将一个原生语言组件分成多个原生语言组件分别进行封装。
S204,确定当前网页视图对应的代理和宿主ID,其中,当前网页视图为调用原生能力的网页视图。在程序设置过程中,代理和宿主ID是会设置为存在关联的,当确定了代理,则就知道了宿主ID,就可以在后续使用宿主环境时通过宿主ID查找对应的宿主环境了。
S205,根据解析后的参数确定待调用的原生能力对应原生方法的名称,并通过第一上下文判断第一预定语言程序是否具有原生方法的调用权限。
当参数解析后,就可以进一步确定第一预定语言程序调用原生时要涉及到哪些具体的方法了,当知晓了具体方法的名称,就可以根据第一上下文来确定第一预定语言程序是否具有这些原生方法的调用权限了。
S206,在第一预定语言程序具有调用权限的情况下,调用原生方法的实例,得到执行结果,并创建转化执行结果的第二上下文。
每一个原生方法都需要对应到具体的实例来执行,因此,在第一预定语言程序具有调用权限的情况下,调用原生方法对应的实例来执行对应的操作,当得到执行结果后,就可以创建第二上下文进行进一步的数据交互了。
S207,根据第二上下文将执行结果转化为第一预定语言程序可执行的第一预定语言代码。
此时,native端已经调用原生方法得到了执行结果,将执行结果转化为第一预定语言程序可以执行的第一预定语言代码,则后续第一预定语言程序执行第一预定语言代码时,就可以实现原生能力的调用了。
S208,确定宿主ID对应的宿主环境,并通过宿主环境中的网页视图执行第一预定语言代码。此时,实现了第一预定语言程序对原生能力的调用。
本发明实施例在第一预定语言程序调用原生能力时,native端根据对应的参数和上下文调用原生能力对应的原生方法,执行原生方法的实例并得到执行结果,再将执行结果转化为第一预定语言代码,则第一预定语言就可以根据第一预定语言代码实现原生能力的调用了。本发明实施例的调用过程简单,无论jsbridge方法如何增加,native端都按照上述简单的流程调用原生方法,耗时较短。
本发明第三实施例提供了一种应用程序原生能力的调用装置,该装置的结构示意如图3所示,包括:
解析模块10,用于解析来自第一预定语言程序的参数,并创建第一预定语言程序调用原生能力的第一上下文,其中,第一预定语言与应用程序的原生语言不同;鉴权模块20,与解析模块10耦合,用于根据解析后的参数确定待调用的原生能力对应原生方法的名称,并通过第一上下文判断第一预定语言程序是否具有原生方法的调用权限;调用模块30,与鉴权模块20耦合,用于在第一预定语言程序具有调用权限的情况下,调用原生方法的实例,得到执行结果,并创建转化执行结果的第二上下文;转化模块40,与调用模块30耦合,用于根据第二上下文将执行结果转化为第一预定语言程序可执行的第一预定语言代码。
由于是第一预定语言程序想要调用原生能力,因此,第一预定语言程序会向native端发送其想要调用的原生能力的参数,当native端接收到第一预定语言程序的参数时,解析模块10就会对该参数进行解析。随后,解析模块10创建第一上下文,以便native端运行过程中进行数据交互。
具体实现的过程中,本实施例的调用装置内的每个模块都可以集成在一起,以一个单独封装的原生语言组件形式存在,该原生语言组件作为原生语言程序的一部分,负责第一预定语言程序调用方法过程中的管理工作。当然,也可以根据实际需要将每个模块都设置成为一个对应的原生语言组件分别进行封装,或者,将某几个模块设置成为一个对应的原生语言组件。
当解析模块10解析参数后,鉴权模块20就可以进一步确定第一预定语言程序调用原生时要涉及到哪些具体的方法了,当知晓了具体方法的名称,就可以根据第一上下文来确定第一预定语言程序是否具有这些原生方法的调用权限了。
每一个原生方法都需要对应到具体的实例来执行,因此,调用模块30在第一预定语言程序具有调用权限的情况下,调用原生方法对应的实例来执行对应的操作,当得到执行结果后,就可以创建第二上下文进行进一步的数据交互了。
此时,native端已经调用原生方法得到了执行结果,转化模块40将执行结果转化为第一预定语言程序可以执行的第一预定语言代码,则第一预定语言程序执行第一预定语言代码时,就可以实现原生能力的调用了。
本发明实施例在第一预定语言程序调用原生能力时,native端根据对应的参数和上下文调用原生能力对应的原生方法,执行原生方法的实例并得到执行结果,再将执行结果转化为第一预定语言代码,则第一预定语言就可以根据第一预定语言代码实现原生能力的调用了。本发明实施例的调用过程简单,无论jsbridge方法如何增加,native端都按照上述简单的流程调用原生方法,耗时较短。
本发明第四实施例提供了一种应用程序原生能力的调用装置,该装置的结构示意如图4所示,包括:
注册模块50,用于将接收到的第一预定语言程序具有调用权限的所有原生能力对应原生方法的名称和实例进行注册;设置模块60,用于确定具有调用原生能力可能性的所有网页视图,并为所有网页视图分别创建宿主环境、生成宿主环境对应的宿主ID和为宿主环境设置对应的代理;解析模块10,与注册模块50和设置模块60耦合,用于解析来自第一预定语言程序的参数,并创建第一预定语言程序调用原生能力的第一上下文,其中,第一预定语言与应用程序的原生语言不同;确定模块70,与解析模块10耦合,用于确定当前网页视图对应的代理和宿主ID,其中,当前网页视图为调用原生能力的网页视图;鉴权模块20,与解析模块10耦合,用于根据解析后的参数确定待调用的原生能力对应原生方法的名称,并通过第一上下文判断第一预定语言程序是否具有原生方法的调用权限;调用模块30,与鉴权模块20耦合,用于在第一预定语言程序具有调用权限的情况下,调用原生方法的实例,得到执行结果,并创建转化执行结果的第二上下文;转化模块40,与调用模块30耦合,用于根据第二上下文将执行结果转化为第一预定语言程序可执行的第一预定语言代码;执行模块80,与确定模块70和转化模块40耦合,用于确定宿主ID对应的宿主环境,并通过宿主环境中的网页视图执行第一预定语言代码。
注册模块50的注册过程为基础过程,当将原生能力对应原生方法的名称和实例进行注册后,就不需要采用注解的方式运行程序时进行收集,有助于处理速度的提升和jsbridge的维护。
设置模块60分别为有可能调用原生能力的网页视图创建了宿主环境,并为宿主环境设置了代理和生成了对应的宿主ID;在网页视图想要调用原生能力的时候,实际上就可以通过代理执行相应的过程,并在宿主环境中执行调用原生能力的过程。上述设置完成后,在可以不直接通过map映射或枚举的方式处理各个封装好的组件间的数据转发和处理,执行效果更好。
由于是第一预定语言程序想要调用原生能力,因此,第一预定语言程序会向native端发送其想要调用的原生能力的参数,当native端接收到第一预定语言程序的参数时,解析模块10就会对该参数进行解析。随后,解析模块10创建第一上下文,以便native端运行过程中进行数据交互。
具体实现的过程中,本实施例的调用装置内的每个模块都可以集成在一起,以一个单独封装的原生语言组件形式存在,该原生语言组件作为原生语言程序的一部分,负责第一预定语言程序调用方法过程中的管理工作。当然,也可以根据实际需要将每个模块都设置成为一个对应的原生语言组件分别进行封装,或者,将某几个模块设置成为一个对应的原生语言组件。
当解析模块10解析参数后,鉴权模块20就可以进一步确定第一预定语言程序调用原生时要涉及到哪些具体的方法了,当知晓了具体方法的名称,就可以根据第一上下文来确定第一预定语言程序是否具有这些原生方法的调用权限了。
每一个原生方法都需要对应到具体的实例来执行,因此,调用模块30在第一预定语言程序具有调用权限的情况下,调用原生方法对应的实例来执行对应的操作,当得到执行结果后,就可以创建第二上下文进行进一步的数据交互了。
此时,native端已经调用原生方法得到了执行结果,转化模块40将执行结果转化为第一预定语言程序可以执行的第一预定语言代码,则第一预定语言程序执行第一预定语言代码时,就可以实现原生能力的调用了。
本发明实施例在第一预定语言程序调用原生能力时,native端根据对应的参数和上下文调用原生能力对应的原生方法,执行原生方法的实例并得到执行结果,再将执行结果转化为第一预定语言代码,则第一预定语言就可以根据第一预定语言代码实现原生能力的调用了。本发明实施例的调用过程简单,无论jsbridge方法如何增加,native端都按照上述简单的流程调用原生方法,耗时较短。
本实施例上述模块的耦合关系仅是一种具体的示例,并不用于限定本发明,本领域技术人员可以根据实际情况对上述耦合方式进行相应的变化,此处不再赘述。
现有的管理和维护jsbridge实现方式存在一些问题:1.依赖复杂:由于每个方法可能被调用到的能力不同,调用不同API(接口)需要的参数等也有不同,这样BridgeObject所依赖的东西越来越多,变得越来越复杂。2.方案限制:该种实现方式通常还会伴随着对系统组件(如Android中的WebView、WebViewClient等)进行一定程度的封装,其他App要引入jsbridge能力还需要引入对应组件的封装,这样可能会对App内已有方案的冲突,对接入App的实现方案带来很多限制。3.复用性低:这样的实现方式普遍会依赖现有App内的一些技术实现,无法轻易复用到其他App中。4.可维护性低:且随着jsbridge方法的增多,BridgeObject通常会变得越来越臃肿,常常找某个方法都要翻阅和定位很长时间,后续也难以维护。
本发明第五实施例针对上述问题,提供了一种存储介质,存储有计算机程序,计算机程序被处理器执行时实现如下步骤S1至S4:
S1,解析来自第一预定语言程序的参数,并创建第一预定语言程序调用原生能力的第一上下文,其中,第一预定语言与应用程序的原生语言不同;
S2,根据解析后的参数确定待调用的原生能力对应原生方法的名称,并通过第一上下文判断第一预定语言程序是否具有原生方法的调用权限;
S3,在第一预定语言程序具有调用权限的情况下,调用原生方法的实例,得到执行结果,并创建转化执行结果的第二上下文;
S4,根据第二上下文将执行结果转化为第一预定语言程序可执行的第一预定语言代码。
上述步骤对应的计算机程序在编写时,可以是以一个原生语言组件形式存在,当然,优选的是以多个原生组件形式存在,这样封装好的多个组件更利于数据交互,且对原生语言程序没有任何侵入。
本实施例根据交互过程将上述步骤S1至S4的过程设计为两个独立封装的原生语言组件,即第一原生语言组件和第二原生语言组件,其中,第一原生语言组件内部编写S1和S4对应的功能代码,第二原生组件内部编写S2和S3对应的功能代码,这样,第一原生语言组件和第二原生语言组件交互正好涉及到两个上下文。当然,本领域技术人员还可以根据实现的功能对齐进行进更多原生语言组件的设置,都在本发明的保护范围内,此处不再赘述。
由于涉及到多个原生语言组件间的交互,因此组件间的交互可以通过请求和响应来实现。例如,第一原生语言组件解析来自第一预定语言程序的参数,并创建第一预定语言程序调用原生能力的第一上下文之后,还需要将参数和第一上下文携带在调用请求中发送至第二原生语言组件。第二原生语言组件在调用原生方法的实例,得到执行结果,并创建转化执行结果的第二上下文之后,还需要根据执行结果和第二上下文构造响应消息,并将响应消息发送至第一原生语言组件。
计算机程序被处理器执行解析来自第一预定语言程序的参数的步骤之前,还被处理器执行如下步骤:将接收到的第一预定语言程序具有调用权限的所有原生能力对应原生方法的名称和实例进行注册;确定具有调用原生能力可能性的所有网页视图,并为所有网页视图分别创建宿主环境、生成宿主环境对应的宿主ID和为宿主环境设置对应的代理。
计算机程序被处理器执行解析来自第一预定语言程序的参数,并创建第一预定语言程序调用原生能力的第一上下文的步骤之后,还被处理器执行如下步骤:确定当前网页视图对应的代理和宿主ID,其中,当前网页视图为调用原生能力的网页视图。
计算机程序被处理器执行根据第二上下文将执行结果转化为第一预定语言程序可执行的第一预定语言代码的步骤之后,还被处理器执行如下步骤:确定宿主ID对应的宿主环境,并通过宿主环境中的网页视图执行第一预定语言代码。
具体进行编程时,上述步骤都可以以不同的原生语言组件形式存在,下面结合具体js端调用native端原生能力来的实例对上述计算机程序进行详细说明。
本实例提出一套无侵入式管理jsbridge的方案,该方案不影响现有App的实现方式,不限制App内采用的技术方案,不依赖App的特定环境,不依赖对组件的封装。
本实例jsbridge方法的管理上使用注册机制,针对不同的调用注册不同的实现;jsbridge方法的调用上使用代理机制,所有方法调用的入口都通过代理进行转发。
本实例的核心原生语言组件(即核心Model)如下:
1.注册组件(BridgeRegistry):
jsbridge方法的注册中心,每个需要提供给js端调用的方法都需要先进行注册;注册时可以注册具体的jsbridge方法实现,也可注册bridge方法生成器。
2.方法组件(BridgeMethod):
抽象的jsbridge方法模型,每个jsbridge方法基于此来实现,能够接收调用上下文(BridgeContext)和调用参数(params)。
3.宿主环境组件(BridgeHost):
jsbridge调用发生的宿主环境,一般是宿主View(如WebView,ReactRootView)。
4.上下文组件(BridgeContext):
jsbridge调用的上下文,包含调用发生所在的宿主环境和回调方法。
5.视图页面标记组件(BridgeViewMarker):
用来给宿主环境view进行标记,生成并维护其全局唯一的宿主ID。
6.代理组件(BridgeDelegate):
jsbridge代理,在调用前,需要提供jsbridge能力的宿主环境需要先进行代理;调用发生时,代理将调用请求(BridgeRequest)转发到BridgeRegistry。
7.管理组件(BridgeModuleManager):
无侵入式的核心,通过标记跟踪法将宿主环境view与有关联的组件像蜘蛛网一样进行关联,宿主view则是网的核心。
其中,上述的注册组件相当于第四实施例中的注册模块、鉴权模块、调用模块实现的相应功能;上述的上下文组件、宿主环境组件、视图页面标记组件相当于第四实施例中的设置模块实现的功能;上述的代理组件相当于第四实施例中解析模块、转化模块实现的相应功能上述的方法组件是为调用方法提供基础,相当于jsbridge方法存储位置;上述的上下文组件保证了交互过程实现生成上下文;上述的管理组件实现了对所有组件进行管理的功能。
上述各个原生语言组件间的流程交互可以如图5所示。
基于上述组件,本实例流程可以分为以下几个阶段:
1.初始化:
即是向BridgeRegistry中注册需要提供的method name和对应的实例。初始化应该在WebView加载h5页面之前完成。
2.代理:
需要提供jsbridge的WebView,且WebView所在的页面(Android中的Activity)需要先行委托代理,注册BridgeHost(Activity,WebView)。代理应该在jsbridge调用发生前。
3.入口:
js端调用jsbridge的方法,最终到达Native端时,统一交给BridgeDelegate。BridgeDelegate通过当前WebView找到上一步委托代理的BridgeHost,并解析js端传递的参数产生调用请求(BridgeRequest),BridgeContext创建调用上下文、宿主环境、宿主ID,然后向BridgeRegistry发起调用请求,传递上下文和参数。
4.鉴权:
BridgeRegistry根据拿到的调用请求,找到具体需要调用的方法,通过鉴权功能结合当前调用上下文校验是否有权限调用。针对鉴权功能,图5中针对鉴权功能单独设置了一个鉴权组件BridgeAuthenticator。
5.执行:
通过鉴权后,开始调用对应的方法,得到执行结果(BridgeResult)后,结合当前调用上下文构造相应消息(BridgeResponse)。如果出现异常,管理组件使用统一异常处理(BridgeExceptionHandler)功能进行处理。
6.响应:
拿到BridgeResponse后,管理组件使用并结合命名空间(BridgeNamespace)功能和编码(BridgeEncoder)功能将BridgeResponse转成js代码,通过宿主环境中的WebView来执行。
实现时,如果是Native端主动触发js端的事件,可先将事件构造成BridgeResponse,并进入“响应”阶段处理。
本发明实施例具有如下优点:
1.BridgeMethod无状态化,不依赖其他模块,每次调用时只根据当前调用上下文和调用参数来进行处理,且固定的上下文和固定的参数一定会得到固定的结果,即相同的输入得到相融的输出。2.BridgeHost维护,通过对宿主View标记并生成全局唯一宿主ID,来达到对宿主环境进行维护。3.管理组件管理宿主环境关系网,把每一个宿主View和与其有关联的组件进行连接,形成一个蜘蛛网一样的结构,每一个宿主view担任着网络核心的作用。4.jsbridge方法通过注册机制来进行管理和维护、通过代理机制来连接每次bridge调用请求和请求发生时的宿主环境。
本发明生实施例的无侵入式的jsbridge实现机制,在接入时,一方面减少业务代码本身的修改,另一方面,对于一些通用的业务模块,可以做到模块方提供一份jsbridge的实现,各业务无需在App内重复实现,直接引入即可。相关逻辑对业务方透明,由模块方进行维护。同时在应对第三方投放推广时,能够减小各App之间的差异、做到规模效应。
本发明上述实施例的存储介质可以设置在至少包括存储器、处理器的电子设备中,以存储器的形式存在,存储器的具体设置此处不再赘述。
可选地,在本实施例中,上述存储介质可以包括但不限于:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。可选地,在本实施例中,处理器根据存储介质中已存储的程序代码执行上述实施例记载的方法步骤。可选地,本实施例中的具体示例可以参考上述实施例及可选实施方式中所描述的示例,本实施例在此不再赘述。显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
本发明第六实施例提供了一种电子设备,如图6所示,该电子设备至少包括存储器901和处理器902,存储器901上存储有计算机程序,处理器902在执行存储器901上的计算机程序时实现本发明任意实施例提供的方法,示例性的,计算机程序步骤如下S11至S14:
S11,解析来自第一预定语言程序的参数,并创建第一预定语言程序调用原生能力的第一上下文,其中,第一预定语言与应用程序的原生语言不同;
S12,根据解析后的参数确定待调用的原生能力对应原生方法的名称,并通过第一上下文判断第一预定语言程序是否具有原生方法的调用权限;
S13,在第一预定语言程序具有调用权限的情况下,调用原生方法的实例,得到执行结果,并创建转化执行结果的第二上下文;
S14,根据第二上下文将执行结果转化为第一预定语言程序可执行的第一预定语言代码。
处理器902在执行存储器901上存储的解析来自第一预定语言程序的参数的计算机程序之前,还可以执行如下计算机程序:将接收到的第一预定语言程序具有调用权限的所有原生能力对应原生方法的名称和实例进行注册。
处理器902在执行存储器901上存储的解析来自第一预定语言程序的参数的计算机程序之前,还可以执行如下计算机程序:确定具有调用原生能力可能性的所有网页视图,并为所有网页视图分别创建宿主环境、生成宿主环境对应的宿主ID和为宿主环境设置对应的代理。
处理器902在执行存储器901上存储的解析来自第一预定语言程序的参数,并创建第一预定语言程序调用原生能力的第一上下文的计算机程序之后,还可以执行如下计算机程序:确定当前网页视图对应的代理和宿主ID,其中,当前网页视图为调用原生能力的网页视图。
处理器902在执行存储器901上存储的根据第二上下文将执行结果转化为第一预定语言程序可执行的第一预定语言代码的计算机程序之后,还可以执行如下计算机程序:确定宿主ID对应的宿主环境,并通过宿主环境中的网页视图执行第一预定语言代码。
本发明实施例在第一预定语言程序调用原生能力时,native端根据对应的参数和上下文调用原生能力对应的原生方法,执行原生方法的实例并得到执行结果,再将执行结果转化为第一预定语言代码,则第一预定语言就可以根据第一预定语言代码实现原生能力的调用了。本发明实施例的调用过程简单,无论jsbridge方法如何增加,native端都按照上述简单的流程调用原生方法,耗时较短。
此外,尽管已经在本文中描述了示例性实施例,其范围包括任何和所有基于本发明的具有等同元件、修改、省略、组合(例如,各种实施例交叉的方案)、改编或改变的实施例。权利要求书中的元件将被基于权利要求中采用的语言宽泛地解释,并不限于在本说明书中或本申请的实施期间所描述的示例,其示例将被解释为非排他性的。因此,本说明书和示例旨在仅被认为是示例,真正的范围和精神由以下权利要求以及其等同物的全部范围所指示。
以上描述旨在是说明性的而不是限制性的。例如,上述示例(或其一个或更多方案)可以彼此组合使用。例如本领域普通技术人员在阅读上述描述时可以使用其它实施例。另外,在上述具体实施方式中,各种特征可以被分组在一起以简单化本发明。这不应解释为一种不要求保护的公开的特征对于任一权利要求是必要的意图。相反,本发明的主题可以少于特定的公开的实施例的全部特征。从而,以下权利要求书作为示例或实施例在此并入具体实施方式中,其中每个权利要求独立地作为单独的实施例,并且考虑这些实施例可以以各种组合或排列彼此组合。本发明的范围应参照所附权利要求以及这些权利要求赋权的等同形式的全部范围来确定。
以上对本发明多个实施例进行了详细说明,但本发明不限于这些具体的实施例,本领域技术人员在本发明构思的基础上,能够做出多种变型和修改实施例,这些变型和修改都应落入本发明所要求保护的范围之内。
Claims (12)
1.一种应用程序原生能力的调用方法,其特征在于,包括:
解析来自第一预定语言程序的参数,并创建所述第一预定语言程序调用原生能力的第一上下文,其中,第一预定语言与应用程序的原生语言不同;
根据解析后的参数确定待调用的原生能力对应原生方法的名称,并通过所述第一上下文判断所述第一预定语言程序是否具有所述原生方法的调用权限;
在所述第一预定语言程序具有所述调用权限的情况下,调用所述原生方法的实例,得到执行结果,并创建转化所述执行结果的第二上下文;
根据所述第二上下文将所述执行结果转化为所述第一预定语言程序可执行的第一预定语言代码。
2.如权利要求1所述的调用方法,其特征在于,解析来自第一预定语言程序的参数之前,还包括:
将接收到的所述第一预定语言程序具有调用权限的所有原生能力对应原生方法的名称和实例进行注册。
3.如权利要求1或2所述的调用方法,其特征在于,解析来自第一预定语言程序的参数之前,还包括:
确定具有调用原生能力可能性的所有网页视图,并为所有网页视图分别创建宿主环境、生成所述宿主环境对应的宿主ID和为所述宿主环境设置对应的代理。
4.如权利要求3所述的调用方法,其特征在于,解析来自第一预定语言程序的参数,并创建所述第一预定语言程序调用原生能力的第一上下文之后,还包括:
确定当前网页视图对应的代理和宿主ID,其中,所述当前网页视图为调用所述原生能力的网页视图。
5.如权利要求4所述的调用方法,其特征在于,根据所述第二上下文将所述执行结果转化为所述第一预定语言程序可执行的第一预定语言代码之后,还包括:
确定所述宿主ID对应的宿主环境,并通过所述宿主环境中的网页视图执行所述第一预定语言代码。
6.一种应用程序原生能力的调用装置,其特征在于,包括:
解析模块,用于解析来自第一预定语言程序的参数,并创建所述第一预定语言程序调用原生能力的第一上下文,其中,第一预定语言与应用程序的原生语言不同;
鉴权模块,用于根据解析后的参数确定待调用的原生能力对应原生方法的名称,并通过所述第一上下文判断所述第一预定语言程序是否具有所述原生方法的调用权限;
调用模块,用于在所述第一预定语言程序具有所述调用权限的情况下,调用所述原生方法的实例,得到执行结果,并创建转化所述执行结果的第二上下文;
转化模块,用于根据所述第二上下文将所述执行结果转化为所述第一预定语言程序可执行的第一预定语言代码。
7.如权利要求6所述的调用装置,其特征在于,还包括:
注册模块,用于将接收到的所述第一预定语言程序具有调用权限的所有原生能力对应原生方法的名称和实例进行注册。
8.如权利要求6或7所述的调用装置,其特征在于,还包括:
设置模块,用于确定具有调用原生能力可能性的所有网页视图,并为所有网页视图分别创建宿主环境、生成所述宿主环境对应的宿主ID和为所述宿主环境设置对应的代理。
9.如权利要求8所述的调用装置,其特征在于,还包括:
确定模块,用于确定当前网页视图对应的代理和宿主ID,其中,所述当前网页视图为调用所述原生能力的网页视图。
10.如权利要求9所述的调用装置,其特征在于,还包括:
执行模块,用于确定所述宿主ID对应的宿主环境,并通过所述宿主环境中的网页视图执行所述第一预定语言代码。
11.一种存储介质,存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至5中任一项所述方法的步骤。
12.一种电子设备,至少包括存储器、处理器,所述存储器上存储有计算机程序,其特征在于,所述处理器在执行所述存储器上的计算机程序时实现权利要求1至5中任一项所述方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811125281.8A CN110955430A (zh) | 2018-09-26 | 2018-09-26 | 应用程序原生能力的调用方法、装置及电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811125281.8A CN110955430A (zh) | 2018-09-26 | 2018-09-26 | 应用程序原生能力的调用方法、装置及电子设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN110955430A true CN110955430A (zh) | 2020-04-03 |
Family
ID=69964702
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811125281.8A Pending CN110955430A (zh) | 2018-09-26 | 2018-09-26 | 应用程序原生能力的调用方法、装置及电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110955430A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113448654A (zh) * | 2020-12-07 | 2021-09-28 | 北京新氧科技有限公司 | web应用程序与原生应用程序的交互方法及装置 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20130263160A1 (en) * | 2012-04-02 | 2013-10-03 | Thomas E. Sandholm | Cross-platform web-based native device feature access |
CN103677843A (zh) * | 2013-12-19 | 2014-03-26 | 深圳市迈桥科技有限公司 | 一种跨移动终端的native能力开发方法及装置 |
CN104102537A (zh) * | 2013-04-07 | 2014-10-15 | 华为技术有限公司 | 一种应用调用方法及用户终端 |
CN105607895A (zh) * | 2014-11-21 | 2016-05-25 | 阿里巴巴集团控股有限公司 | 一种基于应用程序编程接口的应用程序的运行方法和装置 |
CN105718512A (zh) * | 2016-01-13 | 2016-06-29 | 北京齐尔布莱特科技有限公司 | 一种在Ios系统中利用JS语言调用原生语言的方法 |
CN105718313A (zh) * | 2016-01-22 | 2016-06-29 | 北京京东尚科信息技术有限公司 | 应用操作方法和装置 |
-
2018
- 2018-09-26 CN CN201811125281.8A patent/CN110955430A/zh active Pending
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20130263160A1 (en) * | 2012-04-02 | 2013-10-03 | Thomas E. Sandholm | Cross-platform web-based native device feature access |
CN104102537A (zh) * | 2013-04-07 | 2014-10-15 | 华为技术有限公司 | 一种应用调用方法及用户终端 |
CN103677843A (zh) * | 2013-12-19 | 2014-03-26 | 深圳市迈桥科技有限公司 | 一种跨移动终端的native能力开发方法及装置 |
CN105607895A (zh) * | 2014-11-21 | 2016-05-25 | 阿里巴巴集团控股有限公司 | 一种基于应用程序编程接口的应用程序的运行方法和装置 |
CN105718512A (zh) * | 2016-01-13 | 2016-06-29 | 北京齐尔布莱特科技有限公司 | 一种在Ios系统中利用JS语言调用原生语言的方法 |
CN105718313A (zh) * | 2016-01-22 | 2016-06-29 | 北京京东尚科信息技术有限公司 | 应用操作方法和装置 |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113448654A (zh) * | 2020-12-07 | 2021-09-28 | 北京新氧科技有限公司 | web应用程序与原生应用程序的交互方法及装置 |
CN113448654B (zh) * | 2020-12-07 | 2024-03-01 | 北京新氧科技有限公司 | web应用程序与原生应用程序的交互方法及装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108156022B (zh) | 一种服务调用方法、装置及电子设备 | |
CN104866383B (zh) | 一种接口调用方法、装置及终端 | |
CN109325195B (zh) | 浏览器的渲染方法和系统、计算机设备、计算机存储介质 | |
US7941546B2 (en) | Cross-domain communication technique for execution of web mashups | |
CN107360261B (zh) | 一种http请求处理方法、装置及电子设备 | |
JP2011008487A (ja) | 互換性評価装置、互換性評価方法、及びプログラム | |
CN110365724B (zh) | 任务处理方法、装置及电子设备 | |
CN110928548B (zh) | 一种数据处理方法以及设备 | |
CN113076294A (zh) | 一种信息分享方法和装置 | |
CN108664343B (zh) | 一种微服务的有状态调用方法及装置 | |
CN110955430A (zh) | 应用程序原生能力的调用方法、装置及电子设备 | |
CN111414154A (zh) | 前端开发的方法、装置、电子设备和存储介质 | |
CN109981546B (zh) | 获取应用模块间的远程调用关系的方法和装置 | |
CN111158777A (zh) | 组件调用方法、装置及计算机可读存储介质 | |
CN112491943A (zh) | 数据请求方法、装置、存储介质和电子设备 | |
JP2013122655A (ja) | ブラウザ実行スクリプト変換システムおよびブラウザ実行スクリプト変換プログラム | |
KR102407941B1 (ko) | Rpc에 기반하여 외부 장치의 함수 또는 프로시저를 호출하는 전자 장치가 사용자 인터페이스를 생성하는 방법, 그 컴퓨터 프로그램 및 그 전자 장치 | |
JP2013164879A (ja) | 情報処理装置、互換性評価方法、及びプログラム | |
JP7073813B2 (ja) | 制御プログラム、制御方法および情報処理装置 | |
CN114282895A (zh) | 数据处理方法、装置、电子设备及存储介质 | |
CN114064176A (zh) | 一种视图交互方法、装置、电子设备及计算机可读介质 | |
CN113176907A (zh) | 接口数据调用方法、装置、计算机系统及可读存储介质 | |
CN106156339B (zh) | 保单管理系统的访问方法、装置及系统 | |
CN112596929B (zh) | 基于命令事件转换的微服务注册、调用方法及相关装置 | |
CN106570143B (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 | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20200403 |
|
RJ01 | Rejection of invention patent application after publication |