美文网首页
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