當咱們使用一個webView 加載出一個界面,可是webView裏面某個圖片icon咱們不想要,想要去掉它或是修改它。css
新建一個類,繼承NSURLProtocol
@interface QLWebURLProtocol : NSURLProtocol
web
實現協議方法:bash
@implementation QLWebURLProtocol
//方法一:
+ (BOOL)canInitWithRequest:(NSURLRequest *)request {
/*防止無限循環,由於一個請求在被攔截處理過程當中,也會發起一個請求,這樣又會走到這裏,若是不進行處理,就會形成無限循環*/
// if ([NSURLProtocol propertyForKey:protocolKey inRequest:request]) {
// return NO;
// }
NSString * url = request.URL.absoluteString;
NSLog(@"%@",url); //這裏能夠獲取到加載webView全部的加載連接
//若是你想攔截哪一個加載的連接,就返回YES 默認NO
if ([request.URL.absoluteString isEqualToString:@"https://www.baidu.com"]) {
return YES;
}else {
return NO;
}
//判斷要加載的資源本地是否存在
// if ([QLWebURLProtocol localResourceIsExistWith:request]) {
// return YES;
// } else {
// return NO;
// }
// return NO;
}
//方法二
+ (NSURLRequest*)canonicalRequestForRequest:(NSURLRequest*)theRequest
{
return theRequest;
}
//方法三:
- (void)startLoading
{
//拿到你攔截的URL,作你想作的事。 可能禁止這個url,也能夠替換成其餘的URL。。 通常都是加載本地圖片來更換它自有圖片資源
//例如攔截圖片加載,用本地圖片替換,配合本身寫的私有方法
// NSArray *myUrlArr = [[self class] myUrls];
// NSInteger index = [myUrlArr indexOfObject:self.request.URL.absoluteString];
// NSString *imageName = [[[self class] myImageName] objectAtIndex:index];
//
// NSURLResponse *response = [[NSURLResponse alloc] initWithURL:[self.request URL]
// MIMEType:@"image/png"
// expectedContentLength:-1
// textEncodingName:nil];
// NSArray *com = [imageName componentsSeparatedByString:@"."];
// NSString *imagePath = [[NSBundle mainBundle] pathForResource:com[0] ofType:com[1]];
// NSData *data = [NSData dataWithContentsOfFile:imagePath];
//
// [[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
// [[self client] URLProtocol:self didLoadData:data];
// [[self client] URLProtocolDidFinishLoading:self];
}
//方法四:
- (void)stopLoading
{
NSLog(@"something went wrong!");
}
複製代碼
//私有方法,判斷是否有須要替換的東西dom
+ (BOOL)localResourceIsExistWith:(NSURLRequest *)request
{
NSArray *arr = [self myUrls];
if ([arr containsObject:request.URL.absoluteString]) {
return YES;
}
return NO;
}
//要替換的原webView 連接
+ (NSArray*)myUrls
{
return @[@"https://uidesign.gbtcdn.com/check_out/paypal.png?impolicy==true",
@"https://uidesign.gbtcdn.com/check_out/money.png?impolicy=hight",
@"https://icss1.gearbest.com/imagecache/GB2/images/domeimg/pay_method/spp1.jpg",
@"https://uidesign.gbtcdn.com/check_out/poli.png?impolicy=high",
@"https://cashier.gearbest.com/static/img/mcredit.png"];
}
//我本身本地的圖片
+ (NSArray*)myImageName
{
return @[@"paypal.png",
@"money.png",
@"spp1.jpg",
@"poli.png",
@"mcredit.png"];
}
複製代碼
在你使用webView 的方法類初始化中註冊,dealloc方法裏取消註冊便可。ide
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//註冊
[NSURLProtocol registerClass:[QLWebURLProtocol class]];
[self.view addSubview:self.webView];
//用加載百度爲例子
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.baidu.com"]]];
}
複製代碼
這樣就能獲得加載百度全部的請求: ui
以去掉百度logo爲例: 咱們能夠找到百度logo圖片連接url
if ([request.URL.absoluteString isEqualToString:@"https://m.baidu.com/static/index/plus/plus_logo.png"]) {
return YES;
}else {
return NO;
}
複製代碼
startLoading 方法不作任何處理,運行看去掉了百度logo。 spa
//dealloc 方法取消註冊
- (void)dealloc {
[NSURLProtocol unregisterClass:[QLWebURLProtocol class]];
}
複製代碼
以上的方法能夠用來修改webView裏某一個圖片。固然你也能夠攔截到指定的URL,作你想作的其餘事。 WKWebView 貌似不適用。目前我尚未實現。還請大神指導。3d
iOS 12系統以後,UIWebView 已經被廢棄了,如今寫webVIew都會報警告了。因此這個沒有啥太大意義了,畢竟不怎麼使用WebVIew了。(微笑🙂)code