您当前的位置:首页 > 电脑百科 > 程序开发 > 移动端 > H5

h5 与原生 app 交互的原理

时间:2019-07-12 10:36:31  来源:  作者:

现在移动端 web 应用,很多时候都需要与原生 App 进行交互、沟通(运行在 webview中),比如微信的 jssdk,通过 window.wx 对象调用一些原生 app 的功能。所以,这次就来捋一捋 h5 与原生 app 交互的原理。

h5 与原生 app 的交互,本质上说,就是两种调用:

  1. app 调用 h5 的代码
  2. h5 调用 app 的代码

1. app 调用 h5 的代码

因为 app 是宿主,可以直接访问 h5,所以这种调用比较简单,就是在 h5 中曝露一些全局对象(包括方法),然后在原生 app 中调用这些对象。

h5 与原生 app 交互的原理

JAVAscript:

window.sdk = {

double

= value => value *

2

,

triple = value => value *

3

,

};

Android

webview.evaluateJavaScript(

'window.sdk.double(10)'

,

new

ValueCallback

<

String

>() {

@Override

public

void

onReceiveValue(

String

s) {

// 20

}

});

IOS

NSString

*func = @

"window.sdk.double(10)"

;

NSString

*str = [webview stringByEvaluatingJavaScriptFromString:func];

// 20

2. h5 调用 app 的代码

因为 h5 不能直接访问宿主 app,所以这种调用就相对复杂一点。

这种调用常用有两种方式:

  1. 由 app 向 h5 注入一个全局 js 对象,然后在 h5 直接访问这个对象
  2. 由 h5 发起一个自定义协议请求,app 拦截这个请求后,再由 app 调用 h5 中的回调函数

2.1 由 app 向 h5 注入一个全局 js 对象

这种方式沟通机制简单,比较好理解,并且对于 h5 来说,没有新的东西,所以是比较推荐的一种方式。但这种方式可能存在安全隐患,详细查看 你不知道的 Android WebView 使用漏洞。

h5 与原生 app 交互的原理

android:

webview.addJavascriptInterface(

new

Object

() {

@JavascriptInterface

public

int

double

(value) {

return

value *

2

;

}

@JavascriptInterface

public

int

triple(value) {

return

value *

3

;

}

},

"appSdk"

);

ios:

@interface

AppSdk

:

NSObject

{}

- (

int

)

double

:(

int

)value;

- (

int

) triple:(

int

)value;

@end

@implementation

AppSdk

- (

int

)

double

:(

int

)value {

return

value *

2

;

}

- (

int

) triple:(

int

)value {

return

value *

3

;

}

@end

JSContext

*context=[webview valueForKeyPath:@

"documentView.webView.mainFrame.javaScriptContext"

];

AppSdk

*appSdk = [

AppSdk

new

];

context[@

"appSdk"

] = appSdk;

javascript:

window.appSdk.

double

(

10

);

// 20

2.2 由 h5 发起一个自定义协议请求

这种方式要稍复杂一点,因为需要自定义协议,这对很多前端开发者来说是比较新的东西。所以一般不推荐这种方式,可以作为第一种方式的补充。

大致需要以下几个步骤:

  1. 由 app 自定义协议,比如 sdk://action?params
  2. 在 h5 定义好回调函数,比如 window.bridge={getDouble:value=>{},getTriple:value=>{}}
  3. 由 h5 发起一个自定义协议请求,比如 location.href='sdk://double?value=10'
  4. app 拦截这个请求后,进行相应的操作,获取返回值
  5. 由 app 调用 h5 中的回调函数,比如 window.bridge.getDouble(20);
h5 与原生 app 交互的原理

javascript:

window.bridge = {

getDouble: value => {

// 20

},

getTriple: value => {

// more

}

};

location.href =

'sdk://double?value=10'

;

android:

webview.setWebViewClient(

new

WebViewClient

() {

@Override

public

boolean

shouldOverrideUrlLoading(

WebView

view,

String

url) {

// 判断如果 url 是 sdk:// 打头的就拦截掉

// 然后从 url sdk://action?params 中取出 action 与params

Uri

uri =

Uri

.parse(url);

if

( uri.getScheme().equals(

"sdk"

)) {

// 比如 action = double, params = value=10

webview.evaluateJavascript(

'window.bridge.getDouble(20)'

);

return

true

;

}

return

super

.shouldOverrideUrlLoading(view, url);

}

});

ios:

- (BOOL)webview:(

UIWebView

*)webview shouldStartLoadWithRequest:(

NSURLRequest

*)request navigationType:(

UIWebViewNavigationType

)navigationType {

// 判断如果 url 是 sdk:// 打头的就拦截掉

// 然后从 url sdk://action?params 中取出 action 与params

NSString

*urlStr = request.URL.absoluteString;

if

([urlStr hasPrefix:@

"sdk://"

]) {

// 比如 action = double, params = value=10

NSString

*func = @

"window.bridge.getDouble(20)"

;

[webview stringByEvaluatingJavaScriptFromString:func];

return

NO;

}

return

YES;

}



Tags:h5   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
前言前段时间笔者一直忙于数据可视化方面的工作,比如如何实现拖拽式生成可视化大屏,如何定制可视化图表交互和数据导入方案等,这块需求在B端企业中应用非常大,所以非常有探索价...【详细内容】
2021-08-18  Tags: h5  点击:(90)  评论:(0)  加入收藏
首先明确几个概念1. W3C:指万维网联盟(World Wide Web Consortium),是一个国际的标准的制定机构。2. H5(HTML5,HyperText Markup Language 5的缩写),HTML5 是由W3C制定的新HTML标...【详细内容】
2021-07-06  Tags: h5  点击:(153)  评论:(0)  加入收藏
Hybrid APP指的是半原生半Web的混合类App。需要下载安装,看上去类似Native App,但只有很少的UI Web View,访问的内容是 Web 。 原生是Native APP,H5就是Web App在Hybrid 当中,如...【详细内容】
2021-04-28  Tags: h5  点击:(289)  评论:(0)  加入收藏
前言移动端开发在前端里像神一样地存在,不是说它多难而是说它坑位实在太多了,怎样填都填不完。Android和iOS各显神通,Android的系统版本和屏幕分辨率多得难以一招兼容,iOS的顽固...【详细内容】
2021-03-18  Tags: h5  点击:(229)  评论:(0)  加入收藏
前言浏览器越来越强大,从文字、图片、到声音、视频、动画与游戏都有了丰富的应用。H5之后,不仅仅是表现层,数据存储与通讯能力也得到大幅度提高,并逐渐取得共识,形成了标准。随着...【详细内容】
2020-12-29  Tags: h5  点击:(165)  评论:(0)  加入收藏
今天给大家推荐一款超棒的H5可视化网页制作编辑工具H5DS。 h5ds 基于HTML5构建的web网页可视化制作器。通过轻松拖拽元素即可快速生成精美的H5页面。 技术栈 前端:React+Mo...【详细内容】
2020-11-12  Tags: h5  点击:(393)  评论:(0)  加入收藏
项目已经在10月底上线,最近又进入到其他项目里,到今天才抽出时间对这个项目总结一下。回顾一下,在项目的初期就设定为轻量级H5 App,上线后已经运行在 原生app、微信小程序、百...【详细内容】
2020-11-10  Tags: h5  点击:(109)  评论:(0)  加入收藏
上一篇主要是对新项目的一些介绍和对技术栈升级的思考,之前也提到,既然是新项目,从0开始,没有历史包袱,应该可以放手玩了。但考虑到如何能让老项目受益,并且从技术架构的普适性去...【详细内容】
2020-10-23  Tags: h5  点击:(87)  评论:(0)  加入收藏
本文主要讲述的是采用浏览器来识别二维码 / 条形码等,并对其解析得到相应的结果。还有一个目的就是为了验证 iPhone 是否无法自动开启摄像头进行扫描。需求也非常简单,就是用...【详细内容】
2020-10-20  Tags: h5  点击:(1189)  评论:(0)  加入收藏
一、说明1. JSMpeg简介JSMpeg是一个JavaScript编写的视频解码器,支持MPEG1视频、MP2音频解码,WebGL&Canvas2D渲染、WebAudio音频输出。 JSMpeg可以通过Ajax加载静态视频、或...【详细内容】
2020-09-02  Tags: h5  点击:(160)  评论:(0)  加入收藏
▌简易百科推荐
前言在刚接触HTML的时候,你是否被它众多的标签所惊讶?尤其是HTNL5的标签,新增了不少,很多HTML4的标签跨版本之后就用不了了,如此多的标签,要记是不可能记完的,我们只需要一些常用的...【详细内容】
2021-08-27  鳌拜的表哥熬夜    Tags:HTML5   点击:(343)  评论:(0)  加入收藏
前言前段时间笔者一直忙于数据可视化方面的工作,比如如何实现拖拽式生成可视化大屏,如何定制可视化图表交互和数据导入方案等,这块需求在B端企业中应用非常大,所以非常有探索价...【详细内容】
2021-08-18  趣谈前端    Tags:H5编辑器   点击:(90)  评论:(0)  加入收藏
前言移动端开发在前端里像神一样地存在,不是说它多难而是说它坑位实在太多了,怎样填都填不完。Android和iOS各显神通,Android的系统版本和屏幕分辨率多得难以一招兼容,iOS的顽固...【详细内容】
2021-03-18      Tags:H5   点击:(229)  评论:(0)  加入收藏
1.HTML5是什么HTML是web开发中三大规范之一,可以参考:Web前端开发-HTML入门干货 。HTML产生于1990年,1997年的HTML4.0成为互联网标准并广泛应用,HTML5是在HTML4.01(1999年发布)的...【详细内容】
2021-02-19      Tags:HTML5   点击:(195)  评论:(0)  加入收藏
HTML5是HTML4.01和XHTML1.0之后超文本标记语言的最新版本,由一群自由思想者设计,最终实现了多媒体支持、交互性、更智能的表单和更好的语义标注。 HTML 5不只是 HTML规范的最...【详细内容】
2021-01-20      Tags:HTML5   点击:(179)  评论:(0)  加入收藏
前言浏览器越来越强大,从文字、图片、到声音、视频、动画与游戏都有了丰富的应用。H5之后,不仅仅是表现层,数据存储与通讯能力也得到大幅度提高,并逐渐取得共识,形成了标准。随着...【详细内容】
2020-12-29      Tags:H5应用   点击:(165)  评论:(0)  加入收藏
今天给大家隆重推荐一款超强功能的H5西瓜视频播放器插件xgplayer。 xgplayer 字节跳动公司西瓜播放器技术团队推出的开源音视频解决方案,star高达3.2K+。实现自定义加载、缓...【详细内容】
2020-11-24      Tags:XGPlayer   点击:(199)  评论:(0)  加入收藏
今天给大家推荐一款超棒的H5可视化网页制作编辑工具H5DS。 h5ds 基于HTML5构建的web网页可视化制作器。通过轻松拖拽元素即可快速生成精美的H5页面。 技术栈 前端:React+Mo...【详细内容】
2020-11-12      Tags:H5DS   点击:(393)  评论:(0)  加入收藏
今天给大家分享一款超全功能的跨浏览器平台甘特图表库DHTMLXGantt。 dhtmlx-gantt DHTMLX公司开源的 JavaScript 甘特图/横道图/条状图类库。用来快速构建显示项目、进度,和...【详细内容】
2020-11-12      Tags:HTML5   点击:(113)  评论:(0)  加入收藏
项目已经在10月底上线,最近又进入到其他项目里,到今天才抽出时间对这个项目总结一下。回顾一下,在项目的初期就设定为轻量级H5 App,上线后已经运行在 原生app、微信小程序、百...【详细内容】
2020-11-10      Tags:app开发   点击:(109)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条