HTML5可以与本地App交互吗?

前端开发


浏览:901 次

h5与原生App的交互原理

如今,移动webApp经常需要与本地App(在webview中运行)进行交互和通信,例如微信的jssdk通过窗口。wx对象调用一些本地App功能。因此,这次我们将回顾h5与原生App之间的交互原理。

h5和原生App之间的交互本质上是两种调用:

App调用h5的代码

H5调用App的代码

1.App调用h5的代码

因为app是主机,可以直接访问h5,所以这个调用相对简单。它是在h5中公开一些全局对象(包括方法),然后在本地App中调用这些对象。

javascript语言

窗sdk={

;double=值=>值*2,

;三重=值=>值*3,

};

安卓

webview.avalateJavascript('windows.sdk.double(10)',新值回调<String>(){

@推翻

;public void onReceiveValue(字符串){

 nbsp; ;//二十

}

});

网间网操作系统

NSString*func=@“window.sdk.double(10)”;

NSString*str=[webview stringByEvaluatingJavaScriptFromString:func];//二十

2.h5呼叫App代码

因为h5无法直接访问主机应用,所以这个调用相对复杂。

有两种常用的调用方式:

App将一个全局js对象注入h5,然后直接在h5中访问该对象

自定义协议请求由h5发起。App拦截请求后,调用h5中的回调函数

2.1将全局js对象从app注入h5

这种方法的通信机制简单易懂。H5没有什么新功能,因此建议使用。然而,这种方式可能存在安全风险。详细检查您不知道的Android WebView使用漏洞。

安卓

十一

webview。addJavascriptInterface(新对象){

@Javascript接口

;公共int double(值){

 nbsp; ;返回值*2;

}

 nbsp;

@Javascript接口

;公共int三元组(值){

 nbsp; ;返回值*3;

}

},“appSdk”);

网间网操作系统

NSString*scripts=@“window.appSdk={double:value=>value*2,triple:value=>value*3}”;

[webview stringByEvaluatingJavaScriptFromString:scripts];

javascript语言

窗口.appSdk。双(10);//二十

2.2通过h5发送自定义协议请求

这种方法有点复杂,因为它需要自定义协议,这对许多前端开发人员来说是新的。因此,通常不建议使用此方法,可作为第一种方法的补充。

需要以下步骤:

协议由App定制,例如sdk://action?params

在h5中定义回调函数,例如windowbridge={getDouble:value=>{},getTriple:value=>{}}

自定义协议请求由h5发起,例如location href='sdk://double?value=10' ;

App拦截请求后,执行相应的操作以获取返回值

App调用h5中的回调函数,例如window。桥getDouble(20);

javascript语言

窗桥={

;getDouble:value=>{

 nbsp; ;//二十

},

;getTriple:value=>{

 nbsp; ;//更多

}

};

地方href='sdk://double?value=10' ;;

安卓

十一

十二

十三

十四

十五

十六

十七

webview。setWebViewClient(新的WebViewClient){

 nbsp; ;@推翻

 nbsp; ;公共布尔值shouldOverrideUrlLoading(WebView视图,字符串url){

 nbsp; ; ; ; ; ;//判断如果url以sdk://开头,它将被阻止

 nbsp; ; ; ; ; ;//然后从urlsdk://action?params从中执行操作和参数

 nbsp; ; ; ; ; ; ;

 nbsp; ; ; ; ; ;Uri Uri=Uri。解析(url); ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;&铌