WebViewJavascriptBridge是我们经常会用到的一个Objective-C与JavaScript交互的第三方.

想想我们如果不用这个第三方是怎么交互的:

iOS 调 JavaScript

JavaScript 调 iOS

WebView 没法直接调用 iOS,只能触发特定链接,让 iOS 在 WebView 代理方法中捕获到这特定链接,从而执行相应操作,间接实现 WebView 调 iOS.

如果 JavaScript 调用 iOS 的方法比较多, 那我们就要在这个代理方法中各种判断 url, 写很长的 if else. 这样的写法从功能上来说肯定是没问题的, 但是从代码规范来看, 却是很糟糕的, 可读性差, 违反单一原则, 耦合度高等问题. 所以, WebViewJavascriptBridge 这个库就是帮我们来解决这个问题的. 下面我们先来看看用他是怎么实现交互的.

iOS 调 JavaScript

JavaScript 调 iOS

这样一看是不是比原生的方法好多了, iOS 调用 JavaScript 时也是一句话, 但是 JavaScript 调用iOS, 不用再去代理方法中判断url. 直接注册一个我们事先协商好的handler, 然后在回调方法中调用iOS方法. 这种做法是不是正好解决了我们再上面提到那些问题.

WebViewJavascriptBridge 的原理其实还是我们上面说到的系统方法, 只是在这上面封装了一层. 下面我们看一下它的源码.

目录结构

一共只有六个文件, 是不是很少! 好了, 下面我们就逐一击破. 捏柿子就要捡软的捏, 所以我们充分贯彻这一点. 下面先看几个软的.

WKWebViewJavascriptBridge

WKWebViewJavascriptBridge 是为了支持 WKWebView 后来新增的, 跟 WebViewJavascriptBridge 应该差不多少, 所以这部分先不用看.

WebViewJavascriptBridge_JS

WebViewJavascriptBridge_JS 这个文件是什么呢? 点进去看一下, 发现只有一个返回值是字符串的方法. 比较长, 往下看, 发现都是些 JavaScript 的方法, 是不是就可以大胆的猜测一下, 这个是不是就是传说中的bridge.

再往下看, 发现

这个方法是什么呢? 大概看看应该不难理解, 这个方法就是将全局变量WebViewJavascriptBridge 放在 Web 页面的 JavaScript 中.

WebViewJavascriptBridge

1.在初始化时成为 webView 的真实代理

2.暴露接口, 提供 callHandler、registerHandler 方法

3.监听 Url 变化

这个类其实就三个作用:

1.初始化并成为真正的代理
2.提供接口
3.监听 url 变化

而具体实现都是交给 WebViewJavascriptBridgeBase 去完成.

WebViewJavascriptBridgeBase

WebViewJavascriptBridgeBase 其实可以看做是 WebViewJavascript 类的业务层, 实现了CallHandler、registerHandler 方法. 通过操控 WebView 执行 JavaScriptString 以及监听 WebView url 变化, 是真正实现 iOS 与 Web 交互的部分.

1.RegisterHandler

2.CallHandler

需要回调时将 responseCallback 按唯一 callbackId 保存 —> message 转 json 字符串 —> WebView 执行 JavaScriptString.

3.消息处理

messageQueueString 转JSON, 遍历, 拿到 WVJBMessage 类型的数据. 然后查看是否有responseId, 有则是 iOS 端调 Web 端之后所需要的回调. 没有则就是 Web 主动调 iOS 所发送数据.

发表评论

电子邮件地址不会被公开。 必填项已用*标注