zoukankan      html  css  js  c++  java
  • jsbridge与通信模型

    三层通信模型:

    应用层、解释层、会话层;

    通信协议:

    通信原语;

    报文格式;

    网络层:

    _evaluateJavascript

    会话层:

    #define kQueueHasMessage   @"__wvjb_queue_message__"

    #define kBridgeLoaded      @"__bridge_loaded__"

    表示层:

    NSString* responseId = message[@"responseId"];

    WVJBResponseCallback responseCallback = _responseCallbacks[responseId];

    应用层:

    [_bridge callHandler:@"testJavascriptHandler" data:data responseCallback:^(id response) {

            NSLog(@"testJavascriptHandler responded: %@", response);

        }];

    通信机制:

    1、js发送消息

    sendMessageQueue.push(message);

    messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE;

    2、oc端接收消息

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

    NSString *messageQueueString = [self _evaluateJavascript:[_base webViewJavascriptFetchQueyCommand]];

    [_base flushMessageQueue:messageQueueString];

    3、oc端消息处理:

    WVJBHandler handler = self.messageHandlers[message[@"handlerName"]];

    handler(message[@"data"], responseCallback);

    构建返回报文并返回:

    NSString* callbackId = message[@"callbackId"];

                if (callbackId) {

                    responseCallback = ^(id responseData) {

                        if (responseData == nil) {

                            responseData = [NSNull null];

                        }

                        

                        WVJBMessage* msg = @{ @"responseId":callbackId, @"responseData":responseData };

                        [self _queueMessage:msg];

                    };

                }

    4、oc端发送消息

    NSString* javascriptCommand = [NSString stringWithFormat:@"WebViewJavascriptBridge._handleMessageFromObjC('%@');", messageJSON];

    [self _evaluateJavascript:javascriptCommand];

    通信原语:通信控制

    #define kOldProtocolScheme @"wvjbscheme"

    #define kNewProtocolScheme @"https"

    #define kQueueHasMessage   @"__wvjb_queue_message__"

    #define kBridgeLoaded      @"__bridge_loaded__"

    https://__bridge_loaded__/

    https://__wvjb_queue_message__/

    通信报文:

    {

        callbackId = "cb_1_1560136340114";

        data =     {

            foo = bar;

        };

        handlerName = testObjcCallback;

    }

    会话维护:

    callbackId

    responseId

    应用协议:

    handlerName

    生命周期管理

    https://__bridge_loaded__/

  • 相关阅读:
    Accept Xcode/iOS License to run git
    Public Key Retrieval is not allowed
    No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer
    HttpURLConnection调用Restful接口
    关于线程同步(7种同步方式)
    面试(初级)
    面试题(高级)
    RedisTemplate和StringRedisTemplate的区别 RedisTemplate几种序列化方式比较
    Redis 3.2.1集群 —— Redis-trib.rb工具详解(含原理)
    Redis 3.2.1集群 —— CLUSTER MEET ip port
  • 原文地址:https://www.cnblogs.com/feng9exe/p/10997053.html
Copyright © 2011-2022 走看看