攔截webView 請求URL,修改webView內容icon

修改webView裏的某個圖片

當咱們使用一個webView 加載出一個界面,可是webView裏面某個圖片icon咱們不想要,想要去掉它或是修改它。css

方法

新建一個類,繼承NSURLProtocol @interface QLWebURLProtocol : NSURLProtocolweb

實現協議方法: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"]]];
}
複製代碼

百度.png

這樣就能獲得加載百度全部的請求: ui

加載的url.png

以去掉百度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

去掉logo後的百度.png

//dealloc 方法取消註冊
- (void)dealloc {
    [NSURLProtocol unregisterClass:[QLWebURLProtocol class]];
}
複製代碼

以上的方法能夠用來修改webView裏某一個圖片。固然你也能夠攔截到指定的URL,作你想作的其餘事。 WKWebView 貌似不適用。目前我尚未實現。還請大神指導。3d

iOS 12系統以後,UIWebView 已經被廢棄了,如今寫webVIew都會報警告了。因此這個沒有啥太大意義了,畢竟不怎麼使用WebVIew了。(微笑🙂)code

相關文章
相關標籤/搜索