H5与Native的交互?

想必对于Hybrid APP 大家都不陌生,我自己也参与过公司的几个开发项目,但都是不用自己动脑子,前人栽树后人乘凉。

我只要会调用封装好的方法就可以实现H5与原生的交互。但对于一个正常的程序员,求知欲是必须具备的啊。

交互无非是Native调用JS方法,或者JS调用Native提供的接口,但是这两者如何互相调用?就是Webview这个东西。

在IOS中

  我们要知道有UIwebview这个东西,相当于就是个浏览器,但是和正常的浏览器又有区别。

原生的UIwebview提供了一些方法和属性,可以调用来实现交互。

  nativa调用js就是app通过webview来获取window对象,从而可以调用window对象中的方法,而获取方式就可以使用其中的 stringByEvaluatingJavaScriptFromString:执行一段js脚本,并且返回执行结果这个方法。

像这样:

webview.stringByEvaluatingJavaScriptFromString("Math.random()") 

注意获取到的是window对象,所以我们可以将被调用的方法封装起来。

  js调用native:虽然native每个版本都会提供api,但是我们并不能直接拿来用,uiwebview有一个特性:通过uiwebview发起的网络请求可以在native层被拦截和通知。我们就可以自定义一个请求,当检测到这个请求是我们约定的交互请求时就阻止网络请求进而执行我们需要的native功能,这样就实现js调用native。

具体点:自定义的请求格式通常是这样的:jsbridge://methodName?param1=value1&param2=value2,我们只要判断是否是jsbridge://开头的地址

在Android中:

  js调用native:有三种方式:

1.和上面ios一样,使用schema方法,什么是schema方法:

APP安装后会在手机上注册一个schema,比如淘宝是taobao://,Native会有一个进程监控Webview发出的所有schema://请求,然后分发到“控制器”hybridapi处理程序,Native控制器处理时会需要param提供的参数(encode过),处理结束后将携带数据获取Webview window对象中的callback然后调用.

2.上面说到ios中,nativa调用js的方法是uiwebview中有一个方法可以获取到js中的window对象,现在这个Android中js调用native的第二种方法就是native向window对象中注入nativa对象,从而使js能使用这个对象,达到js交互效果。

像这样:

class JSInterface {
    @JavascriptInterface //注意这个代码一定要加上
    public String getUserData() {
        return "UserData";
    }
}
webView.addJavascriptInterface(new JSInterface(), "AndroidJS");  

alert(AndroidJS.getUserData()) //UserDate

3.在android webview这一层是可以重写js原生中的prompt,console.log,alert这三个方法。

  native调用js:和ios一样的,获取window对象,不过使用的方法是loadUrl

像这样:

// 调用js中的JSBridge.trigger方法
webView.loadUrl("javascript:JSBridge.trigger(‘webviewReady‘)");  

以上是自己简单的理解和看法,其中主要是通过以下这两篇文章进行的参考。

http://tech.youzan.com/jsbridge/

http://www.cnblogs.com/yexiaochai/p/4921635.html

时间: 2024-10-09 00:22:20

H5与Native的交互?的相关文章

cordova与ios native code交互的原理

非常早曾经写了一篇博客,总结cordova插件怎么调用到原生代码:cordova调用过程,只是写得太水.基本没有提到原理.近期加深了一点理解,又一次补充说明一下 js调用native 以下是我们产品中的代码片段: datePicker.show(options, function (date) { var month = date.getMonth() + 1; callback(null, date.getFullYear() + "-" + month + "-"

H5与native 普及

H5与native 普及: H5是基于web,native基于客户端native是使用原生系统内核的,相当于直接在系统上操作.,是我们传统意义上的软件,更加稳定.但是H5的APP先得调用系统的浏览器内核,相当于是在网页中进行操作,较原生APP稳定性稍差.APP.但是h5最大的优点是可以跨平台,开发容易.native的话需要用ANDROID的语言和IOS的语言各自写,H5只要开发一套

H5和Native 测试区别

通俗点:H5基于web,Native基于客户端. 深层次点:H5调用系统的浏览器内核,H5可跨平台,易研发(一套即可).Natvie是原生系统内核的,直接在系统上操作,稳定,基于Android.IOS自身语言研发,开发会复杂些. H5测试与PC端测试不同点: 1.通过H5网页(非手机的返回功能)的返回功能可以返回,不会出现无法返回的情况. 2.横屏竖屏相互切换,能自适应,并且布局不会乱掉: 3.为能在不同分辨率的手机上能更好的展示,建议采用响应式设计(如:offerlist页面在大屏时显示3行,

js与native的交互

WebView与Javascript交互(Android): WebView与Javascript交互是双向的数据传递,1.H5网页的JS函数调用Native函数 2.Native函数调用JS函数,具体实现以下面例子为主: 1.)mainfest.xml中加入网络权限 <uses-permission android:name="android.permission.INTERNET"/> 2.)WebView开启支持JavaScript mWebView.getSetti

5月20日重点:当请求的参数是动态的形式时,原生app与h5页面之间数据交互的方法

方案一: 1.app在打开H5页面的时候,把需要给的参数,以get的形式,放在H5的url中. 2.然后H5的js从url中获取到需要的参数,拼接到ajax请求的url中. 3.H5ajax请求,页面渲染. 方案二: 1.app方构建与H5交互的协议 2.H5写一个带参命名函数.在此方法内,填写数据获取后的操作代码. 并把函数名告知app方. 2.app方请求数据,然后以post方法,把请求到的全部数据传入已知的函数中,并调用此函数. 3.H5负责把接收到的数据,进行页面渲染. 注意:1.这个方

webview的javascript与Native code交互

http://my.oschina.net/u/1376187/blog/172296 项目中使用了webview显示网页,其中需要网页和native方法有交互,搜索到一篇文章,转发分享一下: ============================================================================================================================== 转载请注明出处 挺帅的移动开发专栏  http://

Flutter介绍 - Flutter,H5,React Native之间的对比

Flutter介绍 Flutter是Google推出的开源移动应用开发框架.开发者可以通过开发一套代码同时运行在iOS和Android平台. 它使用Dart语言进行开发,并且最终编译成各个平台的Native代码,这样既保证了开发效率,也保证了各个平台的运行效率.其相当于从头到尾重写了一套UI框架,不依赖具体平台的组件.其所有的组件都是"Widget".渲染引擎则依靠高效渲染库Skia实现. 下面我们对比一下H5.React Native.Flutter这些跨平台的解决方案. 移动端的跨

小程序中的web-view与h5网页之间的交互

官方文档:https://developers.weixin.qq.com/miniprogram/dev/component/web-view.html web-view 基础库 1.6.4 开始支持,低版本需做兼容处理 web-view 组件是一个可以用来承载网页的容器,会自动铺满整个小程序页面.个人类型与海外类型的小程序暂不支持使用. 客户端 6.7.2 版本开始,navigationStyle: custom 对 <web-view> 组件无效 属性名 类型 默认值 说明 src St

Flutter 使用 flutter_inappbrowser 加载 H5 及与 js 交互,Methods marked with @UiThread must be executed on the main thread . Current thread: JavaBridge

1. flutter_inappbrowser 插件地址 https://pub.flutter-io.cn/packages/flutter_inappbrowser 2. 添加 js 交互接口添加 3. 如果出现如下 js 接口调用异常时极有可能是应为 flutter 版本升级造成的.更换 flutter 为稳定版即可. (环境使用的是flutter master 分支进行开发,前两天升级了一,升级到 1.5.8-pre 就出现问题了. 想着以为是像 java 中的使用一样,需要切换到 UI