最近項(xiàng)目需要WebView能夠兼容Webp格式的圖片栅迄,節(jié)省用戶(hù)的流量妓灌。
具體實(shí)現(xiàn)是通過(guò)NSURLProtocol攔截WebView的網(wǎng)絡(luò)請(qǐng)求,篩選出請(qǐng)求Webp圖片的網(wǎng)絡(luò)請(qǐng)求存哲,下載完Webp圖片后使用谷歌的WebP解析庫(kù)解析圖片雾袱,轉(zhuǎn)換成Jpg格式圖片,傳給網(wǎng)頁(yè)。
代碼如下:
+ (BOOL)canInitWithRequest:(NSURLRequest *)request
{
if ([NSURLProtocol propertyForKey:TTWebPProtocolHandledKey inRequest:request]) {
return NO;
}
NSURL *url = [request URL];
NSString *userAgent = [request allHTTPHeaderFields][@"User-Agent"];
if (![[userAgent lowercaseString] containsString:@"applewebkit"]) {
return NO;
}
NSString* const requestFiletype = [[url pathExtension] lowercaseString];
return [@"webp" isEqualToString:requestFiletype];
}
+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request
{
return request;
}
- (void)startLoading
{
NSMutableURLRequest *mutableReqeust = [[self request] mutableCopy];
[NSURLProtocol setProperty:@YES forKey:TTWebPProtocolHandledKey inRequest:mutableReqeust];
self.sessionTask = [self.session dataTaskWithRequest:self.request];
[self.sessionTask resume];
}
- (void)stopLoading
{
[self.sessionTask cancel];
self.sessionTask = nil;
}
#pragma mark -- NSURLSessionTaskDelegate
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler
{
self.imgData = [[NSMutableData alloc] init];
[self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
if (completionHandler) {
completionHandler(NSURLSessionResponseAllow);
}
}
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveData:(NSData *)data
{
[self.imgData appendData:data];
}
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didCompleteWithError:(nullable NSError *)error
{
if (error) {
[self.client URLProtocol:self didFailWithError:error];
return;
}
UIImage *webpImg = [UIImage sd_imageWithData:self.imgData];
NSData *imgData = UIImageJPEGRepresentation(webpImg, 1);
[self.client URLProtocol:self didLoadData:imgData];
[self.client URLProtocolDidFinishLoading:self];
}
#pragma mark -- Setter && Getter
- (NSURLSession *)session
{
if (!_session) {
NSURLSessionConfiguration *sessonConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
_session = [NSURLSession sessionWithConfiguration:sessonConfig delegate:self delegateQueue:nil];
}
return _session;
}