美文网首页
Rexxar混合开发框架源码阅读

Rexxar混合开发框架源码阅读

作者: 神似飘逸 | 来源:发表于2019-03-15 18:18 被阅读0次

    一、
    js调用native的方法,通过RXRWidget实现:
    RXRWidget是基于URL拦截实现的

    RXRWidget协议分为三个方法,依次调用
    canPerformWithURL 可根据具体的URL做判断是否响应
    prepareWithURL 从query获取相关参数
    performWithController 完成controller的跳转

    RXRWidget注册:
    RXRViewController初始化的时候,可以完成注册

    RXRWidget调用:
    RXRViewController在wkwebview的shouldStartLoadWithRequest方法中,遍历所有的RXRWidget,完成协议方法的执行调用

    二、NSURLProtocol:拦截wkwebview的网络请求

    /**
     解决 WKWebView 不支持 URLProtocol 的问题
     http://stackoverflow.com/questions/24208229/wkwebview-and-nsurlprotocol-not-working
     */
    - (void)_rxr_registerWebViewCustomSchemes:(WKWebView *)webView
    {
      Class klass = [[webView valueForKey:@"browsingContextController"] class];
      SEL sel = NSSelectorFromString(@"registerSchemeForCustomProtocol:");
      if ([(id)klass respondsToSelector:sel]) {
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
        [(id)klass performSelector:sel withObject:@"https"];
        [(id)klass performSelector:sel withObject:@"http"];
    #pragma clang diagnostic pop
      }
    }
    

    canInitWithRequest 是否打算处理对应的request,如果返回YES,请求的数据会交给URL Loading system
    canonicalRequestForRequest 可以简单的直接返回request,但也可以在这里修改request,比如添加header,修改host等,并返回一个新的request
    startLoading webview发起请求
    stopLoading webview取消请求
    registerClass 注册完毕后,它就有机会来处理所有交付给URL Loading system的网络请求。
    unregisterClass

    三、本地缓存:
    继承NSURLProtocol,重写相关方法,获取请求数据后保存
    初始化RXRViewController时完成NSURLProtocol注册,把webivew的请求交给URL Loading system,获取到数据后保存到本地

    四、路由:
    1、从服务端同步路由表;webview reload会触发更新路由表;webview 404也会触发同步;确保路由表能及时更新,以及webview加载失败后后续页面的加载
    2、查找本地路由,包括缓存和预置资源resource;遍历路由表,根据路由表的正则匹配uri获取路由,获取路由对应的 html 文件地址。根据url查找缓存
    3、查找服务器路由。遍历路由表,根据路由表的正则匹配uri获取路由,获取路由对应的 html 文件地址

    五、模拟请求
    模拟请求,由native实现网络请求。 在startLoading中遍历所有的遵循RXRContainerAPI协议的对象,调用协议方法,由native实现请求方法,发起请求

    六、请求装饰器
    请求装饰器,对发出的请求修改header和请求参数。
    1、在startLoading中遍历所有的遵循RXRDecorator协议的对象,调用协议方法,修改NSMutableURLRequest请求参数。创建NSURLSessionTask,发起网络请求
    2、在NSURLSessionDelegate中willPerformHTTPRedirection,在http请求重定向的代理方法中,遍历遵循RXRDecorator协议的对象,完成修改NSMutableURLRequest,执行completionHandler回调,返回request对象

    七、本地服务代理
    本地服务代理,遵循RXRProxy协议
    在startLoading中遍历所有的遵循RXRProxy协议的对象,当可以代理请求时,创建NSURLResponse,返回代理内容。通过调用NSURLProtocolClient的协议实现
    1、- (void)URLProtocol:(NSURLProtocol *)protocol didReceiveResponse:(NSURLResponse *)response cacheStoragePolicy:(NSURLCacheStoragePolicy)policy; 已创建了NSURLResponse
    2、- (void)URLProtocol:(NSURLProtocol *)protocol didLoadData:(NSData *)data; 已获取请求返回的数据
    3、- (void)URLProtocolDidFinishLoading:(NSURLProtocol *)protocol; 请求已完成

    相关文章

      网友评论

          本文标题:Rexxar混合开发框架源码阅读

          本文链接:https://www.haomeiwen.com/subject/gjflmqtx.html