频繁有客人反馈我们图片在某些地区如:意大利 反馈我们APP图片展示太慢,印象客人下单体验,于是我们开始着手分析。因为我们是混合开发项目,首选确定了iOS不支持,安卓系统4.x以上天然支持不需要处理。
目前,后端给前段传递了图片的原始链接,前段根据不同页面展示需要,动态调整参数。 例如:
其中粗体部分的两个参数,可以极大的影响图片数据包大小:在quality不变的情况下,只调整format,从jpg改为webp大概能达到数据包减1/3~1/2的效果,视觉质量没有明显变化
如果在format不变的情况下,调整quality从100降低到90,大概能达到数据包减1/3~1/2的效果,视觉质量没有明显变化
两者同时调整,大概能达到数据包减2/3左右的效果,视觉质量没有明显变化
一番查阅资料
参考了一些deme发现只能拦截http式的webView,对应加载本地html的方式就无法加载处理,笔者在两者基础上修改实现完成对本地html的支持
其实现展示webp格式的原理是:
[NSURLProtocol registerClass:[HybridNSURLProtocol class]];
对APP发起的所有请求进行拦截,并进行重定向
+ (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)connectionDidFinishLoading:(NSURLConnection *)connection{
if ([connection.currentRequest.URL.absoluteString hasSuffix:@"webp"]) {
NSData *imageData = self.recData;
UIImage *image = [UIImage sd_imageWithWebPData:self.recData];
imageData = UIImagePNGRepresentation(image);
if (!imageData) {
imageData = UIImageJPEGRepresentation(image, 1);
}
[self.client URLProtocol:self didLoadData:imageData];
[self.client URLProtocolDidFinishLoading:self];
}
}
以下是具体代码:
NSURLProtocol+WKWebVIew.h 文件
#import
@interface NSURLProtocol (WKWebVIew)
+ (void)wk_registerScheme:(NSString*)scheme;
+ (void)wk_unregisterScheme:(NSString*)scheme;
@end
NSURLProtocol+WKWebVIew.m 文件
#import "NSURLP