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

WebViewJavascriptBridge原理解析(4)

首先我们发现会初始化一个WebViewJavascriptBridge对象。并且这个对象是赋值给window对象,这里window对象可以理解为webview。所以说我们后面在OC环境中如果要调用js方法,就可以通过 window.WebViewJavascriptBridge 在加上具体方法来调用。

WebViewJavascriptBridge对象中有javascript环境注入的提供给OC调用的方法registerHandler,javascript调用OC环境方法的callHandler。

_fetchQueue这个方法的作用就是把javascript环境的方法序列化成JSON字符串,然后传入OC环境再转换。

_handleMessageFromObjC就是处理OC发给javascript环境的方法。

在这个文件中也初始化了一个iframe实现webview的url跳转功能,从而激发webview代理方法的调用。

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);

上面的src就是 https://__wvjb_queue_message__/ 。这个是javascript发送的OC的第一条消息,目的和上面OC环境的startupMessageQueue一样,就是在javascript环境初始化完成以后,把javascript要发送给OC的消息立即发送出去。

然后我们看文件的最后面有如下代码。这段代码的作用就是立即执行ExampleApp.html中的callback方法。callback中传入的bridge参数就是我们这里初始化的window.WebViewJavascriptBridge对象。

//执行_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); } }

直到这里,OC环境和javascript环境的bridege都建立完毕。OC和javascript环境都有一个bridge对象,这个对象都保存着注册的每个方法和回调,并且维护着各自的消息队列、回调id、requestId等一系列信息。

OC发消息给WEB

OC要调用javascript环境的方法,其实就是调用 ExampleApp.html 中的 bridge.registerHandler 注册的方法。

//点击按钮开始一个OC消息.ExampleWKWebViewController.m中一个方法开始。 - (void)callHandler:(id)sender { id data = @{ @"OC调用JS方法": @"OC调用JS方法的参数" }; [_bridge callHandler:@"OC调用JS提供的方法" data:data responseCallback:^(id response) { // NSLog(@"testJavascriptHandler responded: %@", response); }]; } /* handerName:OC调用JS提供的方法 data:{@"OC调用JS方法的参数":@"OC调用JS方法"} responseCallback:回调block */ - (void)callHandler:(NSString *)handlerName data:(id)data responseCallback:(WVJBResponseCallback)responseCallback { [_base sendData:data responseCallback:responseCallback handlerName:handlerName]; }

把所有信息存入一个名字为message的字典中。里面拼装好参数 data 、回调ID callbackId 、消息名字 handlerName 。具体如下:

- (void)sendData:(id)data responseCallback:(WVJBResponseCallback)responseCallback handlerName:(NSString*)handlerName { NSMutableDictionary* message = [NSMutableDictionary dictionary]; if (data) { message[@"data"] = data; } if (responseCallback) { NSString* callbackId = [NSString stringWithFormat:@"objc_cb_%ld", ++_uniqueId]; self.responseCallbacks[callbackId] = [responseCallback copy]; message[@"callbackId"] = callbackId; } if (handlerName) { message[@"handlerName"] = handlerName; } [self _queueMessage:message]; }

把OC消息序列化、并且转化为javascript环境的格式。然后在主线程中调用_evaluateJavascript。

//把消息发送给WEB环境 - (void)_dispatchMessage:(WVJBMessage*)message { NSString *messageJSON = [self _serializeMessage:message pretty:NO]; [self _log:@"SEND" json:messageJSON]; messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\\" withString:@"\\\\"]; messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""]; messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\'" withString:@"\\\'"]; messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\n" withString:@"\\n"]; messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\r" withString:@"\\r"]; messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\f" withString:@"\\f"]; messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\u2028" withString:@"\\u2028"]; messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\u2029" withString:@"\\u2029"]; NSString* javascriptCommand = [NSString stringWithFormat:@"WebViewJavascriptBridge._handleMessageFromObjC('%@');", messageJSON]; if ([[NSThread currentThread] isMainThread]) { [self _evaluateJavascript:javascriptCommand]; } else { dispatch_sync(dispatch_get_main_queue(), ^{ [self _evaluateJavascript:javascriptCommand]; }); } }
(责任编辑: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 模式识别 什么是模式和模式识别? 广义地说,存在于时间和空间中可观察的事物,如果可以区别它们是否相同或相似,都可以称之为模式;狭义地说,模...