ios wkweb设置图片_iOS WKWebView (NSURLProtocol)拦截js、css,图片资源
项目地址github:HybirdWKWebVIew
HybridNSURLProtocol
一个基于WKWebView的hybirde的容器。能拦截所有WKWKWebView的的css,js,png等网络请求的demo
NSURLProtocol 子类,就可以对 app 内所有的网络请求进行:
[NSURLProtocol registerClass:[HybridNSURLProtocol class]]
可是在 WKWebView 中的请求却完全不遵从这一规则,只是象征性+ (BOOL) canInitWithRequest:(NSURLRequest *)request 方法,之后的整个请求流程似乎就与 NSURLProtocol 完全无关了。
使我WKWebView 的一度认为请求不遵守NSURLProtocol协议,所以不走 NSURLProtocol。这个也是很苦扰我的问题。导致我们hybird的容器1.0也是是用UIWebVIew实现的。
但在苹果放在gittub的CustomHTTPProtocol,明显感觉到WKWebview的也是遵守NSURLProtocol,要不也不会走+ (BOOL)canInitWithRequest:(NSURLRequest *)request;后来一个每天看博客和gittub的习惯帮助了我,找到一个大神的不久前开源库。
使用了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
}
}
注册后,客户端所有请求走+ (BOOL)canInitWithRequest:(NSURLRequest *)request。下面是打印的请求的log
+ (BOOL)canInitWithRequest:(NSURLRequest *)request
{
NSLog(@"request.URL.absoluteString = %@",request.URL.absoluteString);
NSString *scheme = [[request URL] scheme];
if ( ([scheme caseInsensitiveCompare:@"http"] == NSOrderedSame ||
[scheme caseInsensitiveCompare:@"https"] == NSOrderedSame ))
{
//看看是否已经处理过了,防止无限循环
if ([NSURLProtocol propertyForKey:KHybridNSURLProtocolHKey inRequest:request])
return NO;
return YES;
}
return NO;
}
Aaron Swartz
request的重写定向,request的重写定向,替换百度知道的log
+ (BOOL)canInitWithRequest:(NSURLRequest *)request
{
NSLog(@"request.URL.absoluteString = %@",request.URL.absoluteString);
NSString *scheme = [[request URL] scheme];
if ( ([scheme caseInsensitiveCompare:@"http"] == NSOrderedSame ||
[scheme caseInsensitiveCompare:@"https"] == NSOrderedSame ))
{
//看看是否已经处理过了,防止无限循环
if ([NSURLProtocol propertyForKey:KHybridNSURLProtocolHKey inRequest:request])
return NO;
return YES;
}
return NO;
}
这里最好加上缓存判断,加载本地离线文件, 这个直接简单的例子。
- (void)startLoading
{
NSMutableURLRequest *mutableReqeust = [[self request] mutableCopy];
//给我们处理过的请求设置一个标识符, 防止无限循环,
[NSURLProtocol setProperty:@YES forKey:KHybridNSURLProtocolHKey inRequest:mutableReqeust];
//这里最好加上缓存判断,加载本地离线文件, 这个直接简单的例子。
if ([mutableReqeust.URL.absoluteString isEqualToString:sourIconUrl])
{
NSData* data = UIImagePNGRepresentation([UIImage imageNamed:@"medlinker"]);
NSURLResponse* response = [[NSURLResponse alloc] initWithURL:self.request.URL MIMEType:@"image/png" expectedContentLength:data.length textEncodingName:nil];
[self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageAllowed];
[self.client URLProtocol:self didLoadData:data];
[self.client URLProtocolDidFinishLoading:self];
}
else
{
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil];
self.task = [session dataTaskWithRequest:self.request];
[self.task resume];
}
}
下面是代码效果图
WechatIMG1.png
WechatIMG2.jpeg
项目地址:
github:HybirdWKWebVIew,对您有帮助,欢迎star。
有问题反馈
在使用中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流
github:LiuShuoyu
接受启发的作者的github
github:Yeatse CC
苹果开发者文档:apple
ios wkweb设置图片_iOS WKWebView (NSURLProtocol)拦截js、css,图片资源相关推荐
- ios wkweb设置图片_iOS WKWebView识别H5中的图片资源
想获取H5的图片坐标那就需要JS注入了 - (void)handleSingleTap:(UITapGestureRecognizer *)recognizer { CGPoint touchPoin ...
- ios wkweb设置图片_iOS WKWebView的使用
WKWebView的使用 前言 最近项目中的UIWebView被替换为了WKWebView,因此来总结一下. 示例Demo:WKWebView的使用 本文将从以下几方面介绍WKWebView: 1.W ...
- ios wkweb设置图片_ios·WKWebView\UIWebView加载HTMLString,实现图片懒加载
背景: 项目中开发商品类型数据,数据可变性较大,所以商品详情数据存在文案和图片富文本显示,后台返回了html格式的数据供前端展示. 如果用webView直接显示的话,需要等html内容完全展示才能获取 ...
- ios wkweb设置图片_iOS wkwebview和 uiwebview 内容图片自适应大小
- (void)webViewDidFinishLoad:(UIWebView *)webView { // 2.都有效果 NSString *js=@"var script = docum ...
- ios wkweb设置图片_iOS 之 WKWebView自适应高度获取网络图片
WKWebView是iOS8中引入的新组建,苹果将 UIWebViewDelegate 与 UIWebView 重构成了14个类和3个协议并引入了不少新的功能和接口,它代替了UIKit 中的 UIWe ...
- ios wkweb设置图片_在iOS中使用WKWebView如何支持展示webp格式图片(包括本地html)?...
频繁有客人反馈我们图片在某些地区如:意大利 反馈我们APP图片展示太慢,印象客人下单体验,于是我们开始着手分析.因为我们是混合开发项目,首选确定了iOS不支持,安卓系统4.x以上天然支持不需要处理. ...
- 图片轮播,纯js+css
图片轮播,纯js+css <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http: ...
- iosxib 设置图片_iOS使用xcode可视化图像编辑功能进行图片拉伸
iOS中可视化拉伸图片技巧 一.补充 在我的另一篇博客http://my.oschina.net/u/2340880/blog/403996中探讨了IOS拉伸图像(UIImage)的几种方法和一些小经 ...
- iosxib 设置图片_iOS framework制作及使用(包含xib和图片)
制作framework目的:保密项目代码.制作SDK时常用 静态库与动态库简介: 静态库:链接使用时完整地拷贝至可执行文件中 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加 ...
最新文章
- lnline Hook初试
- [UE4]射击和直线追踪
- java double储存原理_Java内存分配原理
- a站手机访问电脑版_公司电脑一键变网盘,支持手机、家里电脑远程访问
- DCMTK:使用dcmimage 库将DICOM图像转换为PPM或PGM
- ubuntu切换中文输入法
- python init函数_在Python中解释类__init __()函数内部和外部的变量。
- [Redis6]新数据类型_HyperLogLog
- 计算机组成原理上机实验报告.doc,计算机组成原理第二次上机实验报告.doc
- AndroidStudio新建项目报错build failed
- 解决在使用CSS3制作不间断轮播图中 收尾连接后Interval 延时问题
- 文本框输入限制正则表达式收集
- matlab db函数_图灵斑图与反应扩散方程——Matlab的实现
- SqlServer2008R2附加数据库错误5123
- Oracle12c操作命令
- 云原生高可用技术体系的构建思路与难点分析
- CCF推荐的A类、B类、C类中文科技期刊2022
- Shiro框架的搭建与使用
- 2022年更新正大杯获得国家二等奖经验优秀报告资料分享全国大学生市场调查与分析大赛市调大赛保研竞赛加分怎么找队友等全套经验分享
- 三十九级台阶java_蓝桥杯 -- 第三十九级台阶
热门文章
- 云原生 | 阿里巴巴的Dapr实践与探索
- ASP.NET Core中间件初始化探究
- BeetleX之Web网关1.5.7安装使用
- 93.7%的程序员!竟然都不知道Redis为什么默认16个数据库?
- Magicodes.IE 在100万数据量下导入导出性能测试
- 一切都要从华为云 CloudIDE 酷似 VS Code 说起
- 基于.NET下的人工智能系列专题|.NET下的人工智能系列专题|用Keras.NET 做一个图像识别的训练...
- .NET架构开发应知应会
- 在.net core 中PetaPoco结合EntityFrameworkCore使用codefirst方法进行开发
- 中间件是什么?在.NET Core中的工作原理又是怎样的呢?