很久之前写的了,最近都统一发了。参考资料,解决问题,总结一下,作为学习
问题
webp 格式图片加载失败
方案
方案1
后端调整?。。。。
方案2
设置库加载图片的请求头
sd_webp.png1:进入SDWebImageDownloader.m 可以看到库提供了请求头设置
所以,相应的配置一下即可
sd_webp_setting.png2:另外一种方式是通过代码静态的设置库的请求头
didFinishLaunchingWithOptions中:
[SDWebImageDownloader.sharedDownloader setValue:@"text/html,application/xhtml+xml,application/xml,image/webp,image/*,*/*;q=0.8"
forHTTPHeaderField:@"Accept"];
关于这种方式设置请求头,解释一下:
- Accept表示浏览器支持的 MIME 类型
-
value值即表示客户端请求服务端生成相应内容的类型
- text/html,application/xhtml+xml,application/xml 都是 MIME 类型,也可以称为媒体类型和内容类型,斜杠前面的是 type(类型),斜杠后面的是 subtype(子类型);type 指定大的范围,subtype 是 type 中范围更明确的类型,即大类中的小类
- Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;
- text/html表示 html 文档;
- Application:用于传输应用程序数据或者二进制数据;
- application/xhtml+xml表示 xhtml 文档;
- application/xml表示 xml 文档
- q是权重系数,范围 0 =< q <= 1,q 值越大,请求越倾向于获得其“;”之前的类型表示的内容,若没有指定 q 值,则默认为1,若被赋值为0,则用于提醒服务器哪些是浏览器不接受的内容类型
- mimetype以逗号分割,越靠前,优先级越高
所以如上设置,图片格式设置了image/webp,表示服务端webp格式的图片不用强转了 ?
是不是设置请求头,服务端知道内容生成格式了?生成image/webp格式?
方案3
SDWebImage支持webp的,可以集成该库:pod 'SDWebImage/WebP',但是问题在于ios11.2之后webp格式的data无法解析为image呀,所以,就需要解决webp的data到image的解析问题
集成 webp
pod依赖库,个人习惯性的search一下,了解最新版本,homepage,source等信息。
pod search SDWebImage/WebP,发现没有搜索到,SDWebImage下没有webp的subspecs,但是pod install时候会发现,installing libwebp。所以,pod search libwebp 能搜索到,也能看到相关homepage,source等,发现libwebp是谷歌上的资源。所以,可能无法访问,会依赖失败
方法1:直接访问源地址
试一下,就算翻墙,可能也会访问错误的:
fatal: unable to access 'chromium.googlesource.com/webm/libweb…': Failed to connect to chromium.googlesource.com port 443: Operation timed out
所以,需要配置host,host列表,将host列表中的配置全部copy到host文件中,有点多,我也惊到了
方法2:更换pod资源地址
打开webp库的libwebp.podsepc.json文件
libwebp1.0.2.png webpsource.png看到source是https://chromium.googlesource.com/webm/libwebp,不通过一些手段是访问不到的
将source改为https://github.com/webmproject/libwebp.git再pod install即可。(能看到,libwebp.git是mirrored from 哪个的,就是上面那个)
注意:修改的是libwebp的source,所以,需要pod 'libwebp'来依赖,如果修改的是搜索出来的最高版本的source,默认安装的就是这个,如果修改的是较低版本的source,那么依赖时候,最好指定版本
webp.data > image
SDWebImage其实是支持webp格式的图片的,所以,11.2系统之前,集成过libwebp后,就可以直接正常加载webp格式的图片了。11.2之后的,webp图片的data无法解析得到image。
这一点,YYWebImage,YYImage支持WebP、APNG、GIF格式动画图像的播放/编码/解码
所以,可以将跟SDWebImage跟YYWebImage和YYImage结合一下
+ (UIImage *)imageWithWebPData:(NSData *)imgData error:(NSError **)error
{
UIImage *webpImage = [YYImage imageWithData:imgData];
return webpImage;
}
方法是重写SDWebImage的方法,,方法体处理是YYImage的解析处理
网友评论