码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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. }

  • 相关阅读:
    docker安装MySQL
    HTML学生个人网站作业设计——HTML+CSS+JavaScript优分期大学生分期购物商城(7页)
    maven中的依赖管理
    痞子衡嵌入式:使用恩智浦GUI Guider快速创建全新LCD屏示例工程的步骤
    顶顶通呼叫中心中间件(mod_cti基于FreeSWITCH)-webrtc(浏览器直接拨打电话)
    Mysql面试必知的知识点-干货分享
    Redis常用命令
    OpenCV dnn模块 分类模型Resnet50 OpenCV dnn模块部署 .onnx模型
    普中精灵开发板stm32烧录程序失败
    jsp汽车销售管理软件Myeclipse开发mysql数据库web结构java编程计算机网页项目
  • 原文地址:https://blog.csdn.net/chengqiang0414/article/details/136323992
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号