WebViewJavascriptBridge 简单利用及原理剖判

WebViewJavascriptBridge 简单利用及原理剖判

WebViewJavaScriptBridge

概述

  从八个地点来说:

  js不能够一直调用oc的章程

 oc能够通过

 – (void)evaluateJavaScript:(NSString *)javaScriptString
completionHandler:(void (^      __nullable)(__nullable id, NSError
* __nullable error))completionHandler;

  那几个办法调用js 的代码

我们从 github上面的demo
https://github.com/marcuswestin/WebViewJavascriptBridge

来剖判一下这些库是怎么着兑现js交互的。

二个OC和JS交互的桥接机制,首要饱含3个类,JS端window.WebViewJavascriptBridge,OC端WebViewJavascriptBridge和WebViewJavascriptBridgeBase。桥接类补助JS调用OC方法,OC调用JS方法。JS调用OC通过重定向url并取handlerName来调用,OC调用JS通过stringByEvaluatingJavaScriptFromString调用。

网络海人民广播广播台湾大学都以在介绍
WebViewJavascriptBridge怎么着使用,那篇小说就来讲说WebViewJavascriptBridge
设计原理。

js调用native的原理

详解

  1. OC端开头化、注册func:

    • 通过开头化方法生成1个WebViewJavascriptBridge以及WebViewJavascriptBridgeBase。webview的delegate改为WebViewJavascriptBridge,WebViewJavascriptBridge的_webViewDelegate是外界传入的webviewController。

      + (instancetype)bridgeForWebView:(WVJB_WEBVIEW_TYPE*)webView webViewDelegate:(WVJB_WEBVIEW_DELEGATE_TYPE*)webViewDelegate handler:(WVJBHandler)messageHandler resourceBundle:(NSBundle*)bundle{ WebViewJavascriptBridge* bridge = [[self alloc] init]; [bridge _platformSpecificSetup:webView webViewDelegate:webViewDelegate handler:messageHandler resourceBundle:bundle]; return bridge;}-  _platformSpecificSetup:(WVJB_WEBVIEW_TYPE*)webView webViewDelegate:(id<UIWebViewDelegate>)webViewDelegate handler:(WVJBHandler)messageHandler resourceBundle:(NSBundle*)bundle { _webView = webView; _webView.delegate = self; _webViewDelegate = webViewDelegate; _base = [[WebViewJavascriptBridgeBase alloc] initWithHandler:(WVJBHandler)messageHandler resourceBundle:(NSBundle*)bundle]; _base.delegate = self;}
      
    • messageHandler是私下认可管理函数,当JS调用OC时,依照办法名找不到OC的block时,恐怕经过send()方法调用OC时,调用该暗中同意messageHandler。

    • messageHandlers是键值对,寄放了OC注册的办法以及相应的办法名。startupMessageQueue是数组,寄存了JS端WebViewJavascriptBridge.js.txt脚本实行以前,OC调用的JS方法信息message。

      -initWithHandler:(WVJBHandler)messageHandler resourceBundle:(NSBundle*)bundle{ self = [super init]; _resourceBundle = bundle; self.messageHandler = messageHandler; self.messageHandlers = [NSMutableDictionary dictionary]; self.startupMessageQueue = [NSMutableArray array]; self.responseCallbacks = [NSMutableDictionary dictionary]; _uniqueId = 0; return;}
      
    • 注册OC方法,调用registerHandler:name
      handler:(WVJBHandler)handler,往messageHandlers键值对中存。

      - registerHandler:(NSString *)handlerName handler:(WVJBHandler)handler { _base.messageHandlers[handlerName] = [handler copy];}
      
  2. JS端开首化、注册func

    • 加载JS脚本

      webView加载完之后,步入webViewDidFinishLoad回调,调用injectJavascriptFile,实行WebViewJavascriptBridge.js脚本。何况把startupMessageQueue中的message批量管理掉。

      - injectJavascriptFile:shouldInject { ... NSString *filePath = [bundle pathForResource:@"WebViewJavascriptBridge.js" ofType:@"txt"]; NSString *js = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil]; [self _evaluateJavascript:js]; [self dispatchStartUpMessageQueue];}- dispatchStartUpMessageQueue { if (self.startupMessageQueue) { for (id queuedMessage in self.startupMessageQueue) { [self _dispatchMessage:queuedMessage]; } self.startupMessageQueue = nil; }}
      
    • WebViewJavascriptBridge.js脚本创造window.WebViewJavascriptBridge对象。_handleMessageFromObjC是OC调用JS的入口。

      window.WebViewJavascriptBridge = { init: init, send: send, registerHandler: registerHandler, callHandler: callHandler, _fetchQueue: _fetchQueue, _handleMessageFromObjC: _handleMessageFromObjC}
      
    • 而且创立一些变量,receiveMessageQueue是数组,存放了init方法调用此前,OC调用JS的音信Message队列。messageHandlers是键值对,寄放JS端注册的法子。sendMessageQueue是Message队列,贮存JS调用OC的法子。

      var messagingIframevar sendMessageQueue = []var receiveMessageQueue = []var messageHandlers = {}
      
    • 登记JS响应措施,调用registerHandler方法注册。

      function registerHandler(handlerName, handler) { messageHandlers[handlerName] = handler}
      
    • init方法早先化,同一时候messageHandler是开首化完的回调block,处理暗许逻辑,和OC的messageHandler成效一样。同期批量拍卖receiveMessageQueue中的音信。

      function init(messageHandler) { WebViewJavascriptBridge._messageHandler = messageHandler var receivedMessages = receiveMessageQueue receiveMessageQueue = null for (var i=0; i<receivedMessages.length; i++) { _dispatchMessageFromObjC(receivedMessages[i]) }}
      
  3. OC端调用JS端func:

    • 调用callHandler:handlerName data:data
      responseCallback:responseCallback方法也许send:data
      responseCallback:responseCallback方法来调用JS方法。内部调用WebViewJavascriptBridgeBase的sendData:data
      responseCallback:responseCallback handlerName:handlerName方法。

      - sendData:data responseCallback:(WVJBResponseCallback)responseCallback handlerName:(NSString*)handlerName { NSMutableDictionary* message = [NSMutableDictionary dictionary]; if  { 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];}
      
    • 要是responseCallback,则创立叁个responseCallback,维护到responseCallbacks键值对中。包装四个Message对象,富含data、handlerName和callbackId,一齐发送。假使WebViewJavascriptBridge.js未加载,则往startupMessageQueue队列里面增加。如若已加载,则发送给window.WebViewJavascriptBridge对象。

      - _queueMessage:(WVJBMessage*)message { if (self.startupMessageQueue) { [self.startupMessageQueue addObject:message]; } else { [self _dispatchMessage:message]; }}- _dispatchMessage:(WVJBMessage*)message { ... NSString* javascriptCommand = [NSString stringWithFormat:@"WebViewJavascriptBridge._handleMessageFromObjC;", messageJSON]; [self _evaluateJavascript:javascriptCommand];}
      
    • 执行_handleMessageFromObjC方法,借使WebViewJavascriptBridge未init早先化,则加多到receiveMessageQueue队列,不然实践dispatchMessageFromObjC。

      function _handleMessageFromObjC(messageJSON) { if (receiveMessageQueue) { receiveMessageQueue.push(messageJSON) } else { _dispatchMessageFromObjC(messageJSON) }}
      
    • dispatchMessageFromObjC,假如有callBackId,则开创三个回调func,通过doSend回调OC,若无handlerName,则调用默许的messageHandler,传data。

      function _dispatchMessageFromObjC(messageJSON) { if (message.callbackId) { var callbackResponseId = message.callbackId responseCallback = function(responseData) { _doSend({ responseId:callbackResponseId, responseData:responseData }) } } var handler = WebViewJavascriptBridge._messageHandler if (message.handlerName) { handler = messageHandlers[message.handlerName] } handler(message.data, responseCallback)}
      
    • 管理回调,js方法调用responseCallback(),传入responseId和responseData,调用doSend方法。doSend方法首先营造八个Message,归入sendMessageQueue中,然后重定向一下scheme://message。

      function _doSend(message, responseCallback) { ... sendMessageQueue.push messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE}
      
    • OC端的WebViewJavascriptBridge拦截到url,获取sendMessageQueue数组中的message,推行flushMessageQueue:message方法。

      - webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { ... NSString *messageQueueString = [self _evaluateJavascript:[_base webViewJavascriptFetchQueyCommand]]; [_base flushMessageQueue:messageQueueString]; ...}
      
    • flushMessageQueue:message方法里决断,假设有responseId,则经过responseId从_responseCallbacks键值对中收取OC的回调方法,並且把responseData传给回调方法。

      - flushMessageQueue:(NSString *)messageQueueString{ for (WVJBMessage* message in messages) { NSString* responseId = message[@"responseId"]; if (responseId) { WVJBResponseCallback responseCallback = _responseCallbacks[responseId]; responseCallback(message[@"responseData"]); } }}
      
  4. JS端调用OC端func:

    • JS调用send和callHandler,然后调用doSend()方法

      _doSend({ handlerName:handlerName, data:data }, responseCallback)
      
    • _doSend方法中,尽管有回调responseCallback,则维护回调responseCallbacks,存放responseCallback。sendMessageQueue里增添message。然后重定向Url。

      function _doSend(message, responseCallback) { if (responseCallback) { var callbackId = 'cb_'+(uniqueId++)+'_'+new Date().getTime() responseCallbacks[callbackId] = responseCallback message['callbackId'] = callbackId } sendMessageQueue.push messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE}
      
    • OC端的shouldStartLoadWithRequest:方法阻碍到url,通过WebViewJavascriptBridge._fetchQueue()获取message队列,然后调用flushMessageQueue方法管理message。

      - webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSString *messageQueueString = [self _evaluateJavascript:[_base webViewJavascriptFetchQueyCommand]]; [_base flushMessageQueue:messageQueueString]; return NO;}
      
    • flushMessageQueue:messageQueue方法,如果有callbackId,则调用_queueMessage方法,传递回调数据以及responseId。如若有handlerName,则调用相应的OC方法,不然调用暗中认可方法messageHandler。

      - flushMessageQueue:(NSString *)messageQueueString{ NSString* callbackId = message[@"callbackId"]; if (callbackId) { responseCallback = ^(id responseData) { if (responseData == nil) { responseData = [NSNull null]; } WVJBMessage* msg = @{ @"responseId":callbackId, @"responseData":responseData }; [self _queueMessage:msg]; }; } WVJBHandler handler; if (message[@"handlerName"]) { handler = self.messageHandlers[message[@"handlerName"]]; } else { handler = self.messageHandler; } handler(message[@"data"], responseCallback);}
      
    • _queueMessage方法,调用dispatchMessage方法,接着调用WebViewJavascriptBridge.handleMessageFromObjC方法。

      - _dispatchMessage:(WVJBMessage*)message { NSString* javascriptCommand = [NSString stringWithFormat:@"WebViewJavascriptBridge._handleMessageFromObjC;", messageJSON]; [self _evaluateJavascript:javascriptCommand];}
      
    • _handleMessageFromObjC调用dispatchMessageFromObjC(messageJSON)方法,借使message有responseId,则透过responseId和responseCallbacks找到JS回调方法,施行。

      function _dispatchMessageFromObjC(messageJSON) { if (message.responseId) { responseCallback = responseCallbacks[message.responseId] if (!responseCallback) { return; } responseCallback(message.responseData) delete responseCallbacks[message.responseId] }}
      

第一从五个经过来说一下:js调用UIViewController中的代码(Native),Native调用js

  1. js中通过bridge.handler{name,data,func()}传入Native中对应的注册名,必要传给Native的数码,和供Native再次来到数据时候调用的函数指针。
  2. 下一场把<name,data,callbackID>包装起来放到js的messages数组中。
  3. 然后经过转移iframe的src属性,发起三个类似网络央求的事物,然后在native的webview的代办方法中开展阻挠。
  4. 阻拦后通超过实际施js的格局_fetchQueue()获取以前messages那一个数组。
  5. 表明responseCallback回调,这么些回调会把<data,callbackId>包装起来,通过原生调用Js方法把它发给Js。
  6. 经过遍历messages,获得在那之中的message,然后收取message中的name,然后经过操作名抽出messageHandlers中对应的handler
  7. 执行handler(message[“data”],responseCallback)

一.  js调用native方法

在概述中说过,js是无法一直调用native的method所以,须要借助-
(BOOL)webView:(UIWebView *)webView
shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType,那些法子我们不面生,每一次在重新定向UEscortL的时候,这一个点子就能够被触发,常常状态,我们会在那边做一些梗阻成功js和当地的直接交互什么的。那么WebViewJavascriptBridge也不别的,也是如此做。

梯次分析代码 :   首先看 ExampleApp.html  文件中所完毕的按键事件
八个按键时间独家是bridge.send() 方法   和   bridge.callHandle()方法    
  在 WebViewJavascriptBridge.js 那个文件中可以观看

callHandler 和 send 方法

终极都以调用了doSend 方法  
分析下那个点子,变量callbackId是个字符串,responseCallBacks[]
一看就理解是个字典
,那几个字典把回调的办法responseCallback给保存起来,那Key(也等于callbackId)是独一的,通过计数和时间应当清楚那几个字符串应该是当世无双的,message也是叁个字典,那是给message增多了多个新的key-value。干嘛呢?小编也不知情,大家来拜会sendMessageQueue是什么,大家一看push就理解应该是个数组。他呢一个字典放到一个音信队列中(数组成代表队列),让后发出一个src(url
scheme)。

屡次解js的同校(举个例子作者) 只要求精通 改动了iframe的src  之后  uiwebview
会实践上边的章程

UIWebView的回调方法

就此大家就足以关心WebViewJavascriptBridge.m文件中的这些方式中做了些什么事

WebViewJavascriptBridge.m

此处经过推断之后会走到 223 行代码  前面return NO; 的因由恐怕大家也清楚了
 是因为大家要举办的是 oc的代码了  所以会阻断 js 代码。
 这里实行了一段js代码  点进去

-(void)webViewJavascriptFetchQueyCommand 方法

执行的js语句 WebViewJavascriptBridge._fetchQueue();

然后去WebViewJavascriptBridge.js中找到那几个点子

WebViewJavascriptBridge.js

重临三个字典  便是大家在最早 要发送音信时存款和储蓄起来的字典
未来我们把要传送的数码拿出去     这里边有哪些东西,作者么来探视

handlerName:handlerName,

data:data,

callbackId:callbackId

得到字典继续向下举办   下面这一个艺术

WebViewJavascriptBridgeBase.m

一体化来看 正是对大家拿出去的数额开展一多种的品类验证
(_log方法是打字与印刷数据新闻的 能够忽略)   回看前面包车型大巴代码
我们就应当通晓这里的responseId为空  所以实行  86 — 114  行的代码

WebViewJavascriptBridgeBase.m

那有的是重中之重,到底他是怎么要调用本地function的,callbackId我们纯熟吧,决断是还是不是为空,不为空给他内定三个block,那个隐私了,block钦命,此时不调用(手动调用才会施行),那几个刚刚说了用来管理native的function管理的result用于把拍卖后的值重临给js的,接着往下去,看到handler这么些方法会从message找到handlerName,这里大家看一下多了三个_messageHandlers字典,从那一个字典获取贰个block(WVJBHandler是三个block),直接实践了。那大家看看_messageHandlers是怎么被增添block的:

WebViewJavascriptBridge.m

那又是何人调用了那么些点子:(在文书
ExampleAppViewController.m的viewdidload中),这里有一些子testObjecCallback

ExampleUIWebViewController

刚刚都以倒推的,假如大家掉转,首先确定是viewdidload最初化,开端化之后会把那几个block加入到_messageHandlers的数组中,之后因为js调用动态读取那一个block调用,在调用从前,大家又把贰个block付值给回掉处理的responseCallback的block,那个block在handler被调用时而被调用,有一点点绕。
略微有一些绕。   今后大家看一下 这几个responseCallback  怎么赋值的  

WebViewJavascriptBridgeBase.m

本着方法往下看  施行到上边这么些艺术

WebViewJavascriptBridgeBase.m

对传进来的多少   @{ @”responseId”:callbackId,
@”responseData”:responseData };管理以往 再试行 js语句  
@”WebViewJavascriptBridge._handleMessageFromObjC(‘%@’);”

看看js的方法  

WebViewJavascriptBridge.js

那一个里面应该很轻巧看到  代码走入待66 行   因为传进来的多寡中responseId
分明不为空  而那中间的responseCallback 方法  和responseCallbacks
数组又是何地来的吗?  我们或然已经忘了 ,回到文首  doSend
方法(重返去拜候)  除了包裹壹个message 字典存起来 还应该有  把
responseCallback 存在了 responseCallBacks[]   中,
所以等到原生的办法实行完之后  再调用这些措施 (在早先时期button点击事件之中早已达成了 ) 达成互动通讯。

这里稍微计算下 便于通晓

1.首先是在UIWebViewController 里面实例化 三个bridge     通过bridge
注册二个 handler  然后保存在messageHandlers中  

  1. 点击网页的button的时候  把新闻保存起来生成一个message 字典
    八个key(handlerName ,
    data,callbackId(前面经过这么些来找到此前的responseCallback方法))  
    何况把 个中的responseCallback 保存起来    何况改换iframe.src  

  2. 其一时候 webView 推行代理方法    在那其间抽取 2步 存起来的新闻 然后给1步的handler中的responseCallback赋值   何况奉行 1步注册的主意    

  所以结果就是 推行oc的回调方法  然后在oc的回调方法里面再去实行 刚刚被赋值的 responseCallback方法(那个点子的响应结果反映在web中)  
至于这一个responseCallback被赋值的历程固然经过第二步的callbackId
找到相应的点子赋过去。

​ WebViewJavascriptBridge提供了一种native和js交互的思路,且相当的轻量。

1.概述

第七步的handler是怎么来的啊,我们在js调用oc方法的时候会在native中调用如下方法,那几个方法最后会在把handler以键值对的点子放置messageHandlers中。

二. native调用js

进程不是直接调用js,也是由此js调用Native进程同样的处理方式。能够看来
最终调用的便是WebViewJavascriptBridgeBase  中的那一个法子   –
(void)sendData:(id)data
responseCallback:(WVJBResponseCallback)responseCallback
handlerName:(NSString*)handlerName;  

WebViewJavascriptBridgeBase.m

把 data  handlerName  callbackId  判空况且存在message
并且把resopnseCallback 方法存起来   然后 后面同上文同样   最终实践到
JS的那一个方法

WebViewJavascriptBridge.js

只是本次实行的是 71 – 90 行的代码     七个剖断  

1  假若有callbakId存在  那么就给落到实处 responseCallback
 那一个方法(并不调用)  

2  就算message.handlerName存在   那么就抽出messageHandlers中
message.handlerName 对应的不二法门  这么些措施一般是在js代码中登记过的

ExampleApp.html

此间最终 借使既有handler 又有callback  
 就会把第一步完结的诀窍赋值给handler的 responseCallback    
 然后在进行到handler的最后一句  responseCallback(responseData)  时候
再实施  推行这几个回调。

图片 1

[_bridge registerHandler:@"testObjcCallback" handler:^(id data, WVJBResponseCallback responseCallback) { NSLog(@"testObjcCallback called: %@", data); responseCallback(@"Response from testObjcCallback"); }];

三.  使用  

诚如的话 都不会这么复杂的传输数据  一般只须求单向的去传递数据
 不会有数不尽的callback 来回的调用。至于oc 的开首化 和 html的开端化
对照github上边包车型客车demo进行就能够了 。      

好多情状下 都以 js在调用原生的 方法   所以 一般都以我们在
我们的方法中作如下的干活

[_eBridge registerHandler:@”backToHomeHandle” handler:^(id data,    
           WVJBResponseCallback responseCallback) {

        [weakSelf.navigationController
popToRootViewControllerAnimated:YES];

}];

此间  @”backToHomeHandle” 正是预订的章程名
 block回调中就是当js代码调用该方法时 大家的原生界面要做出的响应。然后 和
前端的同窗 约定好 数据结构   让他俩在方便的时候
调用大家的格局就能够。职业中用到了 学习了下
供我们参照他事他说加以考察。能够清楚一下那一个Curry面对block回调 以及 js函数式编制程序的应用。

率先有五个难点:

下一场实践handler,js发过来的数目就足以让大家在native使用。方法中的block就能够被施行,然后调用responseCallback(),大家以前注册的responseCallback就能被施行,然后responseCallback()中带的data就能够发送到js的主意中。在js的主意中会实践responseCallback()方法,然后小说开端那么些func()就可以被调用,获得native重返的数量。

a. Native(中的UIWebView)是或不是能够直接调用js method(方法)? 能够。

总结

b. js 是还是不是足以直接调用Native的 method?不行。

简单易行便是js传数据和函数指针到native,native获取数据,并试行这一个函数指针,就会在接到到多少后,再把部分数量传给js。

明显性上述四个难题,那么上航海用教室就轻巧驾驭了,webpage中的 js method和 webview
本地的method之间关系。那WebViewJavascriptBridge出现是不是解决那一个难题(那些主题素材正是让js能够向来调用native的method)呢?答案是还是不是认的?未有精神还是用uiwebview的代理方法开展字段拦截(判别url
scheme),完结js直接调用native的method。

js和native分别维护着和谐的众多新闻数组,回调数组,操作数组…非常多。

大家来看WebViewJavascriptBridge提供的demo:

native通过推行js代码来博取音讯数组里面这几个多少和指针,获取后把数据中的操作名称拿出去看自个儿的这边维护的操作数组里面有未有登记那些操作,有就进行操作。

图片 2

关于回调,那正是正当的叁个native操作中举办作为它参数带过来的四个带参数的block,这些block通过native调用js代码,来把数据传到js。

重大的宗旨是下边多少个,接下去大家就来商讨一下其布置原理。

更简明的本子js那边有个数组里面放要实施的法子名字,回调函数等等的,oc获取这一个数组,根据内部的名字,施行相应的点子,和js的回调函数。

  1. js调用Native method

措施调用图

在概述中说过,js是无法直接调用native的method所以,必要依据

– (BOOL)webView:(UIWebView *)webView
shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType

以此点子大家不生分,每一趟在重复定向UKugaL的时候,这么些主意就能被触发,常常状态,我们会在那边做一些挡住成功js和本地的直接交互什么的。那么WebViewJavascriptBridge也不另外,也是那般做。

笔者们先来探视在ExampleApp.html文本中式点心击三个按键发起呼吁的代码:

var callbackButton =
document.getElementById(‘buttons’).appendChild(document.createElement(‘button’))

callbackButton.innerHTML =’Fire testObjcCallback’

callbackButton.onclick = function(e) {

e.preventDefault()

log(‘JS calling handler “testObjcCallback”‘)

//1

bridge.callHandler(‘testObjcCallback’, {‘foo’:’cccccccccccc’},
function(response) {

log(‘JS got response’, response)

})

}

预计大家轮廓都能看懂,唯只有疑难的地点是:

bridge.callHandler(‘testObjcCallback’, {‘foo’:’cccccccccccc’},
function(response) {

log(‘JS got response’, response)

})

}

这段代码先不说,下面代码就是三个按键的常见单击事件措施。大家一道想转手,假若这一个开关需求被点击之后调用native中的funtion函数,之后须要把这些(native的)funtion函数管理结果再次来到给js中的方法继续管理。那么些是大家供给,带着那么些供给大家看一下以此方式,testObjcCallBack这一个大家疑忌一下应该native中的方法可能一个可见调用到点子的name/id,前边那些是个json{‘foo’:‘ccccccccccccc’},应该是个参数,那么后边那些点子一看log应该领会,是对native重临的result举行拍卖的点子。拿具体是否吗?只要找到callHandler方法就理解了。

在文书WebView JavascriptBridge.js.txt里面大家找找那一个主意:

function callHandler(handlerName, data, responseCallback) {

_doSend({ handlerName:handlerName, data:data }, responseCallback)

}

此地又多了二个办法叫_doSend连个参数
首个是字典key-value定义,第三个是多少个方式的指针(看看下面的艺术你就清楚了),那我们必得在同二个文书之中看看能否找到这几个_doSend方法:

function _doSend(message, responseCallback) {

if(responseCallback) {

var callbackId =’cb_’+(uniqueId++)+’_’+newDate().getTime()

responseCallbacks[callbackId] = responseCallback

message[‘callbackId’] = callbackId

}

sendMessageQueue.push(message)

messagingIframe.src = CUSTOM_PROTOCOL_SCHEME +’://’+
QUEUE_HAS_MESSAGE

}

找到了。

发表评论

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

网站地图xml地图