• iOS 通过NSURLProtocol拦截WKWebView网络请求


    以前NSURLProtocol可以直接拦截UIWebView,后面升级成WKWebView发现拦截不到了

    有细心爱研究的老铁发现了 [WKBrowsingContextController  registerSchemeForCustomProtocol:]  这个函数的存在

    所以还是可以拦截的

    直接上步骤

    1.在控制器或者你喜欢的地方注册NSURLProtocol(调用以下代码)

    1. Class cls = NSClassFromString(@"WKBrowsingContextController");
    2. SEL sel = NSSelectorFromString(@"registerSchemeForCustomProtocol:");
    3. if ([(id)cls respondsToSelector:sel]) {
    4. [(id)cls performSelector:sel withObject:@"http"];
    5. [(id)cls performSelector:sel withObject:@"https"];
    6. }
    7. [NSURLProtocol registerClass:[CustomProtocol class]];

    2.在你自定义的NSURLProtocol类中实现拦截

    1. + (BOOL)canInitWithRequest:(NSURLRequest *)request{
    2. NSString *abstring = request.URL.absoluteString;
    3. if ([abstring containsString:@"你喜欢的标记"]) {
    4. return YES;
    5. }
    6. return NO;
    7. }
    8. + (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request
    9. {
    10. return request;
    11. }

    3.在你自定义的NSURLProtocol类中拦截后替换请求的内容,以下以图片为例

    1. - (void)startLoading{
    2. NSString *urlPathString = super.request.URL.absoluteString;
    3. if ([urlPathString containsString:@"你喜欢的标记"]) {
    4. urlPathString = [urlPathString stringByReplacingOccurrencesOfString:@"你喜欢的标记" withString:@"你喜欢的标记2"];
    5. }
    6. NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlPathString]];
    7. NSMutableDictionary *header = [NSMutableDictionary dictionary];
    8. header[@"Content-Length"] = [NSString stringWithFormat:@"%ld",imageData.length];
    9. NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:self.request.URL
    10. statusCode:200 HTTPVersion:@"1.1" headerFields:header];
    11. //回调
    12. [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageAllowed];
    13. [self.client URLProtocol:self didLoadData:imageData];
    14. [self.client URLProtocolDidFinishLoading:self];
    15. }
    16. - (void)stopLoading{
    17. NSLog(@"stop");
    18. }

  • 相关阅读:
    微信小程序4种弹框
    C语言指向数组元素的指针变量的定义和赋值
    分享几种 Java8 中通过 Stream 对列表进行去重的方法
    数据中心的“灾备”
    什么叫做虚基类,它有何作用
    pod(一):Kubernetes(k8s)创建pod的两种方式
    SQL当前查询条件数据需要调用其他数据时创建临时表实现
    [LeetCode周赛复盘] 第 326 场周赛20230101
    案例--某站视频爬取
    中断系统需要解决的问题
  • 原文地址:https://blog.csdn.net/chengqiang0414/article/details/136323992