当前位置: 首页 > 科技观察

Android原生与H5通信

时间:2023-03-12 22:07:53 科技观察

今天,混合开发似乎成为了主流。H5具有跨平台的优势,但是存在性能问题,可以通过构建原生shell承载H5代码来解决。这个方法怎么理解就好比说Android原生代码封装了shell,里面包含了H5代码作为核心内容。更详细的,我们写一些与业务无关,与用户交互较多的引导页、登录页、首页等。业务页面的逻辑代码由H5处理。将它们结合起来形成一个由原生shell托管的混合开发的H5APP。这样做有什么好处?作为示例,我们使用此方法制作了一个Android原生应用程序。现在我们需要制作一个IOS原生应用。我们可以简单的搭建一个IOSshell,复用H5代码来完成IOS原生app。.同时我们需要在钉钉、微信小程序等平台上进行构建,这样就可以直接复用我们已有的H5代码。这种构建方式相对于纯H5构建APP的优势在于,由于原生shell的存在,原生API可以自由使用。保证交互的流畅性。如何实现原生与H5的通信?关于通信,我们需要解决两个问题:原生到H5通信H5到原生通信第一个问题很容易解决。以Android为例,WebView提供了一个独特的方法。当你打开一个Html时,你可以调用这个Html中包含的JS。例如:webview.loadUrl("javascript:callH5('Androidok')");第二个问题是通过发送指令来处理的。以Android为例,WebView可以拦截html跳转时的url地址。我们可以使用这个地址来商定规则。如果满足规则,则拦截后不执行跳转。我们可以通过这个url获取到我们需要的信息,并执行相应的操作。window.location.href=protocol://android?code=toast&data=+Json.stringify(config)以上是一个JS页面跳转方法。我们规定规则PRE=protocol://android?,当我们拦截的url中包含PRE时,我们认为这是一条指令,不需要跳转到页面,应该进行相应的操作。参数code就是我们命令的内容,data就是通讯时传递的参数。接下来是原始处理。首先我们拦截url。这里笔者也处理了H5页面因Http攻击出现广告的问题。我们的主要是第一个if。webView.setWebViewClient(newWebViewClient(){//LoadopenedURLintheapplicationinsteadofstandardbrowser//applicationpublicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl){showLogInfo("拦截的url----"+url);Stringadvertising="http://"+sharedPreferencesUtil.getData(Constant.IP,RequestConfig.IP)+":"+sharedPreferencesUtil.getData(Constant.PORT,RequestConfig.IPPORT);if(url.contains(pre)){Mapmap=getParamsMap(url,pre);Stringcode=map.get("代码");Stringdata=map.get("data");parseCode(code,data);returntrue;}elseif(!url.contains(advertising)){showLogError("拦截植入广告,广告的url——"+url);returntrue;}else{returnfalse;}}});return为true,表示拦截成功,不会执行后续的跳转操作。而false表示按正常流程执行。拦截成功后,我们从url中获取代码和数据,然后我们就可以根据自己的需要进行处理了。