首页 > 其他分享 >跨端之桥方法原理及实现

跨端之桥方法原理及实现

时间:2023-06-30 13:44:38浏览次数:40  
标签:调用 之桥 send js 跨端 原理 webview 方法 native

本文探讨 js 与 app 原生的交互

场景

移动端页面需要和 app 进行一些交互,比如获取在 app 中的用户信息,分享后回调需要 app 来通知 h5 完成页面渲染,js 中调用 app 方法等

webView

webview 是android 加载网页的一个控件,可以通过 webview 加载网络/本地的html,或者运行网络/本地的js

native 调用 js方法

前提在 webview 中开启对 js 支持,初始化 webview 中添加 webSetting.setJavaScriptEnabled(true)

  • loadUrl:webview 中方法,传入参数中添加以 javascript:为前缀,加上对应的 js 方法(即 function),在 onPageFinished (载入页面完成,但在不同内核里调用的实际好像不一样)后才会运行
  • evaluageJavaScript:webview 中方法,传入参数同 loadUrl 相同,后加一个回调函数。这种方法不会刷新页面,提高效率。只支持4.4+以上的系统

js 调用native方法

  • addJavascriptInterface:webview 提供的可以让 js 调用 native 中的方法,如 mwebView.addJavascriptInterface(new JSCallJava(this), 'caller'),JSCallJava 就是java代码中提供给 js 调用的类,js 中可以通过caller.callJava来调用。在早期版本中存在漏洞,攻击者可以通过 js 加载 java 中的反射类去执行本地命令,高版本中可以通过 @JavascriptInter 进行规避

    传数据的两种方法:

  • shoulOverrideUrlLoading:通过拦截 url 跳转来实现 js 调用 native 方法,通过自定义url 协议格式传数据,在这个WebViewClient 中的 shouldOverrideUrlLoading 中拦截处理

  • onJsxxx系列:通过WebChromeClient拦截js对话框实现对 native 调用,WebChromeClient 中存在三种弹框,分别是alert,confirm,prompt,对应的方法为onJsAlert,onJsConfirm,onJsPrompt。在 js 代码中执行相应的方法,通过约定的数据格式传递数据

JsBridge

native 和 h5 交互桥梁,内部实现还是通过 loadUrl 和 shouldOverrideUrlLoading 来实现 js 和 native 的互调。实际使用中需要用 BridgeWebView 替代 WebView,BridgeWebView 在 init 时会默认加载一个 BridgeWebViewClient,其中重写了 shouldOverrideUrlLoding 对从 js 传入的数据进行分发,在 onPageFinished 中将 WebViewJavaScriptBridge.js 加载到 html 页面中。

native 中调用 js

  • send 方法:mBridgeWebView.send(data, callback),可以设置回调接收从 js 中获取到的结果,send 会使用 js 中默认的handle处理
  • 自定义方法 callHandle,native 中mBridgeWebView.callHandle(handlerName, data, callback),js 中 bridge.registerHandler(handleName, function(){})

js 调用 native

有 WebViewJavaScriptBridge.js 的封装,可以用类似步骤实现

  • send:window.WebViewJavascriptBridge.send(data, callback)
  • callHandle:window.WebViewJavaScriptBridge.callHandle(handleName, data, callback),在 native 中注册好 handlemBridge.registerHandle(handleName, callback)

参考

JsBridge-总结和优化

android 可能的坑

标签:调用,之桥,send,js,跨端,原理,webview,方法,native
From: https://www.cnblogs.com/EGBDFACE/p/17510338.html

相关文章

  • 跨端之小程序面试题总结
    微信小程序的相关文件类型WXML(WeiXinMarkupLanguage)是框架设计的一套标签语言,结合基础组件、事件系统,可以构建出页面的结构。内部主要是微信自己定义的一套组件WXSS(WeiXinStyleSheets)是一套样式语言,用于描述WXML的组件样式js逻辑处理,网络请求json小程序设置,如页面......
  • 你没见过的分库分表原理解析和解决方案(二)
    你没见过的分库分表原理解析和解决方案(二)高并发三驾马车:分库分表、MQ、缓存。今天给大家带来的就是分库分表的干货解决方案,哪怕你不用我的框架也可以从中听到不一样的结局方案和实现。一款支持自动分表分库的orm框架easy-query帮助您解脱跨库带来的复杂业务代码,并且提供多......
  • kratos http原理
    概念kratos为了使http协议的逻辑代码和grpc的逻辑代码使用同一份,选择了基于protobuf的IDL文件使用proto插件生成辅助代码的方式。protochttp插件的地址为:https://github.com/go-kratos/kratos/tree/main/cmd/protoc-gen-go-http示例syntax="proto3";packagehelloworld;......
  • HashMap 的底层原理和源码分析
    tip:作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。推荐:体系化学习Java(Java面试专题)文章目录一、HashMap的底层原理二、put方法源码分析三、get方法源码分析四、remove方法源码分析一、HashMap的底......
  • ArrayList 的底层原理和源码分析
    tip:作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。推荐:体系化学习Java(Java面试专题)文章目录一、简介二、自动扩容机制三、add方法的源码分析四、addAll方法的源码分析五、set方法的源码分析六、remove方......
  • Python的手机测试工具uiautomator2库的实现原理
    使用python通过调试模式测试安卓手机APP,使用uiautomator2库是比较方便的,这个库的源码网址是:https://github.com/openatx/uiautomator2通过阅读源码,大概搞明白了其实现原理,它是通过调用adbutils库,获取UI的hierarchydump数据,然后检索对应的UI节点,计算此节点的UI区......
  • java反序列化漏洞原理
    1.首先是序列化的过程序列化:ObjectOutputStream类-->writeObject()将对象进行序列化,把字节序列写到一个目标输出流中.ser2.反序列化反序列化:ObjectInputStream类-->readObject()从一个源输入流中读取字节序列,再把它们反序列化为一个对象 如果序列化字节序列内容......
  • 数据对象校验原理
    表单数据校验jquery-validationThejQueryValidationPluginprovidesdrop-invalidationforyourexistingforms,whilemakingallkindsofcustomizationstofityourapplicationreallyeasy.来自jquery-validation项目。大概就是提供嵌入式的方式去校验表单,灵活......
  • 宏观经济学原理
    GDP的概念在某一既定时期一个国家内生产的所有最终物品与服务的市场价值。GDP=消费+投资+政府购买+净出口净出口外国对国内生产的物品的支出(出口)减国内对外国物品的支出(进口)GDP增多生产了更多的物品与服务以更高的价格销售物品与服务名义、真实GDP名义GDP:按现期价格评......
  • Iterator和LlistIterator迭代器的使用及底层原理:
    先来看下面的示例:publicclassDemo{publicstaticvoidmain(String[]args)throwsIOException{List<String>list=newLinkedList<>();list.add("唐僧");list.add("孙悟空");list.add("猪八戒")......