NSURLProtocol能够拦截UIWebView内所有的请求,但是WKWebView 中的请求却完全不遵从这一规则,只是象征性调用canInitWithRequest方法,之后的整个请求流程似乎就与 NSURLProtocol 完全无关了。使我一度认为WKWebView请求不遵守NSURLProtocol协议。

其实是能够做到的,因为WKWebView没有开放相关的API,所以我们需要使用私有API调用来实现。使用WKBrowsingContextController和registerSchemeForCustomProtocol。 通过反射的方式拿到了私有的 class/selector。通过kvc取到browsingContextController。通过把注册把 http 和 https 请求交给 NSURLProtocol 处理。

[NSURLProtocol wk_registerScheme:@"http"];
[NSURLProtocol wk_registerScheme:@"https"];

下面直接上源代码吧

//FOUNDATION_STATIC_INLINE 属于属于runtime范畴,你的.m文件需要频繁调用一个函数,可以用static inline来声明。在SDWebImage读取内存的缓存也用到这个声明。
FOUNDATION_STATIC_INLINE Class ContextControllerClass() {
static Class cls;
if (!cls) {
cls = [[[WKWebView new] valueForKey:@"browsingContextController"] class];
}
return cls;
}FOUNDATION_STATIC_INLINE SEL RegisterSchemeSelector() {
return NSSelectorFromString(@"registerSchemeForCustomProtocol:");
}FOUNDATION_STATIC_INLINE SEL UnregisterSchemeSelector() {
return NSSelectorFromString(@"unregisterSchemeForCustomProtocol:");
}@implementation NSURLProtocol (WebKitSupport)+ (void)wk_registerScheme:(NSString *)scheme {
Class cls = ContextControllerClass();
SEL sel = RegisterSchemeSelector();
if ([(id)cls respondsToSelector:sel]) {
// 放弃编辑器警告
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[(id)cls performSelector:sel withObject:scheme];
#pragma clang diagnostic pop
}
}+ (void)wk_unregisterScheme:(NSString *)scheme {
Class cls = ContextControllerClass();
SEL sel = UnregisterSchemeSelector();
if ([(id)cls respondsToSelector:sel]) {
// 放弃编辑器警告
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[(id)cls performSelector:sel withObject:scheme];
#pragma clang diagnostic pop
}
}

注册后,WKWebView内的请求也会走canInitWithRequest方法了。

转载:https://www.jianshu.com/p/4fc13d4d5607

让WKWebView支持NSURLProtocol相关推荐

  1. ios如何解除dns被劫持_iOS监控:DNS劫持

    DNS劫持指在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则返回假的IP地址或者什么都不做使请求失去响应,其效果就是对特定的网络不能反应或访问的是假网址. DNS服 ...

  2. ios如何解除dns被劫持_iOS监控-DNS劫持

    前言 DNS劫持指在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则返回假的IP地址或者什么都不做使请求失去响应. DNS劫持的主要表现为看视频,点击之后莫名其妙的跳 ...

  3. WKWebView概述

    一.概述 1.iOS 8 SDK中发布了新的WebView框架----WebKit.framework. 2.WebKit使用WKWebView来代替IOS的UIWebView和OSX的NSWebVi ...

  4. iOS WKWebView基本使用总结

    UIWebView废弃,迁移WKWebView WWDC 2018中 ,在安全方面,Session上来就宣布了一件重量级的大事,UIWebView正式被官方宣布废弃,建议开发者迁移适配到WKWebVi ...

  5. WKWebview使用记录

    0.WKWebview加载在线网页,解决中文乱码 NSString*str = [URL stringByAddingPercentEncodingWithAllowedCharacters:[NSC ...

  6. WKWebView预初始化

    开篇语: 由于业务需求,我们采用了WKWebView和其它view混合布局的展现方案.如果你的WKWebView个数不多,例如同一个页面不超过3个WKWebView,是很难发现这个瓶颈问题.不是内存占 ...

  7. ip访问 webstorem_常见问题-iOS WebView IP直连 如何处理 Cookie

    WKWebView 无法使用 NSURLProtocol 拦截请求 针对该问题方案如下: 换用 UIWebView 使用私有 API 进行注册拦截 换用 UIWebView 方案不做赘述,说明下使用私 ...

  8. iOS新闻类App内容页技术探索

    为了更好的阅读体验,建议阅读原文 据相关数据显示,截至2017年底,中国手机新闻客户端用户规模达到6.36亿人,移动App已经成为新闻和内容传播的最重要途径之一.而伴随着行业的竞争和发展,App中的内 ...

  9. iOS开发中的Web应用概述

    为了更好的阅读体验,建议阅读原文 插播广告 -- 几十行代码完成资讯类App多种形式内容页 HybridPageKit :一个针对资讯类App高性能.易扩展.组件化的通用内容页实现框架. 想和我一起全 ...

最新文章

  1. RecycleView 嵌套 RecycleView 导致自动滚动
  2. 还在担心工作被AI取代?不如掌握这门硬实力,抢占职场发展机遇
  3. delphi初级教程之delphi断点调试一
  4. Opportunity在Fiori cloud system上编辑之后超时的根源分析
  5. macrotask和microtask以及EventLoop的介绍
  6. 蔚来上线三款硬货:更大电池包、全新EC6、改款ES8
  7. kmeans及模型评估指标_聚类分析的过程和两个常用的聚类算法
  8. android执行lua脚本的方法,从Android应用程序调用Lua脚本
  9. eclipse -- git 提示
  10. 扒一扒微信后台架构.....
  11. IDEA2018全局搜索中搜索jar包/lib
  12. python时间序列如何拟合曲线_以“datetime”格式拟合时间序列的曲线?
  13. 快速在小程序上实现“友情链接/合作伙伴”功能
  14. 计算机c盘坏了,电脑c盘损坏,怎样修复?
  15. Eclipse 使用的注意 灵格斯 取词
  16. **电压跟随器的原理**
  17. CSR蓝牙芯片进测试模式方法
  18. 安装deepin微信报错: dpkg: 依赖关系问题使得 deepin.com.wechat:i386 的配置工作不能继续 解决办法如下:
  19. c语言 乱码转化为16进制_C语言版的16进制与字符串互转函数
  20. Microsoft Excel 教程「41」,如何在 Excel 图表中添加标题?

热门文章

  1. 二、python框架相关知识体系
  2. [数位dp] bzoj 3209 花神的数论题
  3. pandas 学习(二)—— pandas 下的常用函数
  4. 使用spring-data-mongodb操作mongodb
  5. android user版本默认开启调试模式
  6. PHP操作MongoDB GridFS 存储文件
  7. C++ primer 4th 第10章《关联容器》总结
  8. Leetcode--523. 连续的子数组和
  9. 公众号 接收规则 消息_微信公众平台 发送模板消息(Java接口开发)
  10. msk 频偏_一种MSK-Type信号的频率同步改进算法