让WKWebView支持NSURLProtocol
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相关推荐
- ios如何解除dns被劫持_iOS监控:DNS劫持
DNS劫持指在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则返回假的IP地址或者什么都不做使请求失去响应,其效果就是对特定的网络不能反应或访问的是假网址. DNS服 ...
- ios如何解除dns被劫持_iOS监控-DNS劫持
前言 DNS劫持指在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则返回假的IP地址或者什么都不做使请求失去响应. DNS劫持的主要表现为看视频,点击之后莫名其妙的跳 ...
- WKWebView概述
一.概述 1.iOS 8 SDK中发布了新的WebView框架----WebKit.framework. 2.WebKit使用WKWebView来代替IOS的UIWebView和OSX的NSWebVi ...
- iOS WKWebView基本使用总结
UIWebView废弃,迁移WKWebView WWDC 2018中 ,在安全方面,Session上来就宣布了一件重量级的大事,UIWebView正式被官方宣布废弃,建议开发者迁移适配到WKWebVi ...
- WKWebview使用记录
0.WKWebview加载在线网页,解决中文乱码 NSString*str = [URL stringByAddingPercentEncodingWithAllowedCharacters:[NSC ...
- WKWebView预初始化
开篇语: 由于业务需求,我们采用了WKWebView和其它view混合布局的展现方案.如果你的WKWebView个数不多,例如同一个页面不超过3个WKWebView,是很难发现这个瓶颈问题.不是内存占 ...
- ip访问 webstorem_常见问题-iOS WebView IP直连 如何处理 Cookie
WKWebView 无法使用 NSURLProtocol 拦截请求 针对该问题方案如下: 换用 UIWebView 使用私有 API 进行注册拦截 换用 UIWebView 方案不做赘述,说明下使用私 ...
- iOS新闻类App内容页技术探索
为了更好的阅读体验,建议阅读原文 据相关数据显示,截至2017年底,中国手机新闻客户端用户规模达到6.36亿人,移动App已经成为新闻和内容传播的最重要途径之一.而伴随着行业的竞争和发展,App中的内 ...
- iOS开发中的Web应用概述
为了更好的阅读体验,建议阅读原文 插播广告 -- 几十行代码完成资讯类App多种形式内容页 HybridPageKit :一个针对资讯类App高性能.易扩展.组件化的通用内容页实现框架. 想和我一起全 ...
最新文章
- RecycleView 嵌套 RecycleView 导致自动滚动
- 还在担心工作被AI取代?不如掌握这门硬实力,抢占职场发展机遇
- delphi初级教程之delphi断点调试一
- Opportunity在Fiori cloud system上编辑之后超时的根源分析
- macrotask和microtask以及EventLoop的介绍
- 蔚来上线三款硬货:更大电池包、全新EC6、改款ES8
- kmeans及模型评估指标_聚类分析的过程和两个常用的聚类算法
- android执行lua脚本的方法,从Android应用程序调用Lua脚本
- eclipse -- git 提示
- 扒一扒微信后台架构.....
- IDEA2018全局搜索中搜索jar包/lib
- python时间序列如何拟合曲线_以“datetime”格式拟合时间序列的曲线?
- 快速在小程序上实现“友情链接/合作伙伴”功能
- 计算机c盘坏了,电脑c盘损坏,怎样修复?
- Eclipse 使用的注意 灵格斯 取词
- **电压跟随器的原理**
- CSR蓝牙芯片进测试模式方法
- 安装deepin微信报错: dpkg: 依赖关系问题使得 deepin.com.wechat:i386 的配置工作不能继续 解决办法如下:
- c语言 乱码转化为16进制_C语言版的16进制与字符串互转函数
- Microsoft Excel 教程「41」,如何在 Excel 图表中添加标题?
热门文章
- 二、python框架相关知识体系
- [数位dp] bzoj 3209 花神的数论题
- pandas 学习(二)—— pandas 下的常用函数
- 使用spring-data-mongodb操作mongodb
- android user版本默认开启调试模式
- PHP操作MongoDB GridFS 存储文件
- C++ primer 4th 第10章《关联容器》总结
- Leetcode--523. 连续的子数组和
- 公众号 接收规则 消息_微信公众平台 发送模板消息(Java接口开发)
- msk 频偏_一种MSK-Type信号的频率同步改进算法