一、
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; 请求已完成
网友评论