close
当前位置: 物联网在线 > 技术文库 > ios >

WebViewJavascriptBridge原理解析(3)

上面我们讲到了注入javascript方法到webview中。具体的代码就是 WebViewJavascriptBridge_JS.js 这个文件中的方法。我们通过分析这个文件的代码可以知道javascript环境的bridge是如何初始化的。

;(function() { //如果已经初始化了,则返回。 if (window.WebViewJavascriptBridge) { return; } if (!window.onerror) { window.onerror = function(msg, url, line) { console.log("WebViewJavascriptBridge: ERROR:" + msg + "@" + url + ":" + line); } } //初始化一些属性。 var messagingIframe; //用于存储消息列表 var sendMessageQueue = []; //用于存储消息 var messageHandlers = {}; //通过下面两个协议组合来确定是否是特定的消息,然后拦击。 var CUSTOM_PROTOCOL_SCHEME = 'https'; var QUEUE_HAS_MESSAGE = '__wvjb_queue_message__'; //oc调用js的回调 var responseCallbacks = {}; //消息对应的id var uniqueId = 1; //是否设置消息超时 var dispatchMessagesWithTimeoutSafety = true; //web端注册一个消息方法 function registerHandler(handlerName, handler) { messageHandlers[handlerName] = handler; } //web端调用一个OC注册的消息 function callHandler(handlerName, data, responseCallback) { if (arguments.length == 2 && typeof data == 'function') { responseCallback = data; data = null; } _doSend({ handlerName: handlerName, data: data }, responseCallback); } function disableJavscriptAlertBoxSafetyTimeout() { dispatchMessagesWithTimeoutSafety = false; } //把消息转换成JSON字符串返回 function _fetchQueue() { var messageQueueString = JSON.stringify(sendMessageQueue); sendMessageQueue = []; return messageQueueString; } //OC调用JS的入口方法 function _handleMessageFromObjC(messageJSON) { _dispatchMessageFromObjC(messageJSON); } //初始化桥接对象,OC可以通过WebViewJavascriptBridge来调用JS里面的各种方法。 window.WebViewJavascriptBridge = { registerHandler: registerHandler, callHandler: callHandler, disableJavscriptAlertBoxSafetyTimeout: disableJavscriptAlertBoxSafetyTimeout, _fetchQueue: _fetchQueue, _handleMessageFromObjC: _handleMessageFromObjC }; //处理从OC返回的消息。 function _dispatchMessageFromObjC(messageJSON) { if (dispatchMessagesWithTimeoutSafety) { setTimeout(_doDispatchMessageFromObjC); } else { _doDispatchMessageFromObjC(); } function _doDispatchMessageFromObjC() { var message = JSON.parse(messageJSON); var messageHandler; var responseCallback; //回调 if (message.responseId) { responseCallback = responseCallbacks[message.responseId]; if (!responseCallback) { return; } responseCallback(message.responseData); delete responseCallbacks[message.responseId]; } else {//主动调用 if (message.callbackId) { var callbackResponseId = message.callbackId; responseCallback = function(responseData) { _doSend({ handlerName: message.handlerName, responseId: callbackResponseId, responseData: responseData }); }; } //获取JS注册的函数 var handler = messageHandlers[message.handlerName]; if (!handler) { console.log("WebViewJavascriptBridge: WARNING: no handler for message from ObjC:", message); } else { //调用JS中的对应函数处理 handler(message.data, responseCallback); } } } } //把消息从JS发送到OC,执行具体的发送操作。 function _doSend(message, responseCallback) { if (responseCallback) { var callbackId = 'cb_' + (uniqueId++) + '_' + new Date().getTime(); //存储消息的回调ID responseCallbacks[callbackId] = responseCallback; //把消息对应的回调ID和消息一起发送,以供消息返回以后使用。 message['callbackId'] = callbackId; } //把消息放入消息列表 sendMessageQueue.push(message); //下面这句话会出发JS对OC的调用 //让webview执行跳转操作,从而可以在 //webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler 中拦截到JS发给OC的消息 messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE; } messagingIframe = document.createElement('iframe'); messagingIframe.style.display = 'none'; //messagingIframe.body.style.backgroundColor="#0000ff"; messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE; document.documentElement.appendChild(messagingIframe); //注册_disableJavascriptAlertBoxSafetyTimeout方法,让OC可以关闭回调超时,默认是开启的。 registerHandler("_disableJavascriptAlertBoxSafetyTimeout", disableJavscriptAlertBoxSafetyTimeout); //执行_callWVJBCallbacks方法 setTimeout(_callWVJBCallbacks, 0); //初始化WEB中注册的方法。这个方法会把WEB中的hander注册到bridge中。 //下面的代码其实就是执行WEB中的callback函数。 function _callWVJBCallbacks() { var callbacks = window.WVJBCallbacks; delete window.WVJBCallbacks; for (var i = 0; i < callbacks.length; i++) { callbacks[i](WebViewJavascriptBridge); } } })();

其实我们发现整个js文件就是一个立即执行的javascript方法。


(责任编辑:ioter)


用户喜欢...

我们和毫米波雷达来一次“亲密接触”,了解一下它的概念和工作原理

无论是激光雷达还是摄像头、超声波传感器,都容易受恶劣天气环境影响导致性能降低甚至失效,因而都存在致命缺陷!但毫米波雷达凭借其可穿透尘雾、雨雪、不受恶劣天气影响的绝对优势,...


对数放大器的基本原理及其处理宽动态范围信号的方法

使用高动态范围信号对设计人员来说是一个主要问题。 如何将幅度变化超过100分贝(dB)的信号应用于线性放大器或模数转换器(ADC),典型动态范围为60 dB至100 dB? 像这样的信号发生在回波...


使用 ToF 传感器进行距离测量和手势识别的基本原理

很多应用需要在不接触实际物体的情况下,感测物体的存在或距离。这种接近感应需求催生了众多竞争性解决方案,包括光学飞行时间 (ToF) 传感器。虽然这些传感器非常精确,但其成本一直非...


电流测量的基本原理:第 1 部分 - 电流检测电阻器

编者按:本系列文章包含两个部分,将介绍电流检测中容易忽视的细节。本文为第 1 部分,将讨论电流检测电阻的一般设置、选择和实现。第 2 部分将讨论相关电路,例如关键的模拟前端 (AF...


什么是锁相环(PLL)?锁相环的工作原理是什么?锁相环电路对硬件电路连接有什么要求?

锁相环是一种反馈电路,其作用是使得电路上的时钟和某一外部时钟的相位同步。PLL通过比较外部信号的相位和由压控晶振(VCXO)的相位来实现同步的,在比较的过程中,锁相环电路会不断根...


IBM解析2018年最流行的五项IoT趋势

2017年,物联网技术(loT)为传统行业带来了变革的风声和兴奋的议论。这是一场实质性的转变。我们已经能够看到,几乎所有的行业都在投资物联网,而且其中的佼佼者已经开始迅速采取行...


神经网络从原理到实现

1.简单介绍 在机器学习和认知科学领域,人工神经网络(artificial neural network,缩写ANN),简称神经网络(neural network,缩写NN)或类神经网络,是一种模仿生物神经网络(动物的中枢神经系统,...


自动扫地机器人好用吗?智能特性全面解析

生活在如今这样一个节奏快、工作压力大的时代,我们的压力也是越发的大了,但是人类的智慧是强大的,智能家居...


unity静态批处理原理理解

1、静态批处理的时间点 1)在游戏导出的时候,在player setting中勾选static batching,这样在导出包的时候就进行批处理,导出来的包就会比较大 2 ) 在游戏场景中勾选场景物体的static选项,在加...


统计模式识别的原理与方法

1 统计模式识别的原理与方法简介 1.1 模式识别 什么是模式和模式识别? 广义地说,存在于时间和空间中可观察的事物,如果可以区别它们是否相同或相似,都可以称之为模式;狭义地说,模...