// IOS swift code
func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
let url = request.URL
let scheme = url?.scheme
let method = url?.host
let query = url?.query
if url != nil && scheme == “jsbridge” {
switch method! {
case “getShare”:
self.getShare()
default:
print(“default”)
}
return false
} else {
return true
}
}
看不懂就略过,非重点。。。。。
这里我们在请求参数中加上了cbName=jsCallClientBack,这个jsCallClientBack为JS调用客户端所定义的回调函数,在业务层jsBridge封装中,我们传入一个匿名函数作为回调,底层将这个函数绑定在window的jsbridge对象下并为其定义一个独一无二的key,这个key就是jsCallClientBack,客户端在处理完逻辑后,会通过上面已经介绍过的方法来回调window下的方法。
ps: 在将回调绑定在window下时,特别注意要使用bind保持函数内this的原有指向不变
IOS客户端调用H5方法
Native调用Javascript语言,是通过UIWebView组件的stringByEvaluatingJavaScriptFromString方法来实现的,该方法返回js脚本的执行结果。
// IOS swift code
webview.stringByEvaluatingJavaScriptFromString(“window.methodName()”)
从上面代码可以看出它其实就是执行了一个字符串化的js代码,调用了window下的一个对象,如果我们要让native来调用我们js写的方法,那这个方法就要在window下能访问到。但从全局考虑,我们只要暴露一个对象如JSBridge给native调用就好了。
调用客户端原生方法的回调函数也将绑在window下供客户端成功反调用,实际上一次调用客户端方法最后产生的结果是双向互相调用。
H5调用Android客户端方法
在安卓webView中有三种调用native的方式:
通过schema方式,客户端使用shouldOverrideUrlLoading方法对url请求协议进行解析。这种js的调用方式与ios的一样,使用iframe来调用native方法。通过在webview页面里直接注入原生js代码方式,使用addJavascriptInterface方法来实现。
// android JAVA code
class JSInterface {
@JavascriptInterface
public String getShare() {
//…
return “share”;
}
}
webView.addJavascriptInterface(new JSInterface(), “AndroidNativeApi”);
上面的代码就是在页面的window
对象里注入了AndroidNativeApi
对象。在js里可以直接调用原生方法。
使用prompt,console.log,alert
方式,这三个方法对js里是属性原生的,在android webview
这一层是可以重写这三个方法的。一般我们使用prompt
,因为这个在js里使用的不多,用来和native通讯副作用比较少。
// android JAVA code
class WebChromeClient extends WebChromeClient {
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
// 重写window下的prompt,通过result返回结果
}
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
}
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
}
}
一般而言安卓客户端选用1、2方案中的一种进行通信,从前端层面来讲,推荐客户端都使用schema
协议的方式,便于前端jsBridge底层代码的维护与迭代。
Android客户端调用H5方法
在安卓APP中,客户端通过webview
的loadUrl
进行调用:
// android JAVA code
webView.loadUrl(“javascript:window.jsBridge.getShare()”);
H5端将方法绑定在window下的对象即可,无需与IOS作区分
H5调用RN客户端
我们知道RN的webView组件实际上就是对原生容器的二次封装,因此我们不需要直接通过schema
协议来通信,只需要使用浏览器postMessage、onMessage
来传递消息即可,类似于iframe
,而真正的通信过程RN已经帮我们做了。
// h5 js code
window.postMessage(data);
// rn js code
<WebView
ref=“webView”
source={require(‘…/html/index.html’)}
injectedJavaScript={‘window.androidConfig = {}’} // 通过这个props可以在webView初始化时注入属性方法
onMessage={e => {
let { data } = e.nativeEvent;
//…
}}
/>
RN客户端调用H5
postMessage
是双向的,所以也可以在RN里发消息,H5里接消息来触发对应的回调
this.refs.webView.postMessage({
cbName: ‘xxx’,
param: {}
});
前端jsBridge的封装
在了解了js与客户端底层的通信原理后,我们可以将IOS、安卓统一封装成jsBridge提供给业务层开发调用。
class JsBridge {
static lastCallTime
constructor() {
if (UA.isReactNative()) {
document.addEventListener(‘message’, function(e) {
window.jsClientCallBacke.data.cbName;
});
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
写在最后
最后我想说:对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!
这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
相信它会给大家带来很多收获:
当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
中…(img-NXZzMFUw-1712637592888)]
[外链图片转存中…(img-WwlA3KCi-1712637592888)]
当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-DySGCqx9-1712637592888)]