很久之前寫的了,最近都統一發了。參考資料,解決問題,總結一下,作為學習
問題
webp 格式圖片加載失敗
方案
方案1
后端調整?。。。。
方案2
設置庫加載圖片的請求頭
1:進入SDWebImageDownloader.m 可以看到庫提供了請求頭設置
所以,相應的配置一下即可
2:另外一種方式是通過代碼靜態的設置庫的請求頭
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文件
看到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的解析處理