iOS使用URLSessionDownloadTask進(jìn)行斷點續(xù)傳獲取續(xù)傳數(shù)據(jù)為空的坑。ETag 和 Last-Modified

今天在使用URLSessionDownloadTask實現(xiàn)斷點續(xù)傳功能時發(fā)現(xiàn)在暫停時始終拿不到resumeData數(shù)據(jù),導(dǎo)致無法實現(xiàn)斷點續(xù)傳。

使用cancel方法data始終為nil

task?.cancel(byProducingResumeData: {  (data) in
})

從頭檢查了很多遍,沒有任何問題,最后通過查閱官方文檔,終于發(fā)現(xiàn)了問題所在。


image.png

文檔中準(zhǔn)確描述了response的header中需要包括ETag or Last-Modified,我們后臺提供的下載鏈接的header中并沒有包含這兩個字段,加上后斷點續(xù)傳就成功了。

為什么需要加入這兩個字段呢?

Last-Modified

客戶端在第一次請求某個URL成功后,服務(wù)器返回的response中會包含Last-Modified,用來表示服務(wù)器資源最后一次被修改的時間,格式如下
Last-Modified: Wed, 23 Mar 2022 16:35:58 GMT
當(dāng)?shù)诙卧L問這個URL后,客戶端會在header中傳入If-Modified-Since,用來詢問服務(wù)器這個時間之后是否有過修改,格式如下
If-Modified-Since: Wed, 23 Mar 2022 16:35:58 GMT
如果沒有修改,則服務(wù)器會返回304,告訴客戶端沒有修改,則客戶端可以使用緩存數(shù)據(jù),如果有修改,則服務(wù)器會返回新的數(shù)據(jù)。

ETag

ETag在HTTP 協(xié)議規(guī)格的定義為“被請求變量的實體值”。ETag表示資源標(biāo)識是否有變更,而Last-Modified更傾向于時間狀態(tài)。
ETag:"623b4c6e-1+8e4947"
ETag一般是文件內(nèi)容的hash值生成的,當(dāng)文件內(nèi)容發(fā)生變化,ETag也會發(fā)生變化,由于Last-Modified最小時間是秒,所以可能在數(shù)據(jù)變化很快的情況下,Last-Modified會有不準(zhǔn)確的缺點。這是使用ETag就要比Last-Modified用更加準(zhǔn)確。(事實上,很多時候會將這兩個一起使用)
和Last-Modified相似,在第一次請求拿到ETag后,客戶端會在第二次訪問服務(wù)器時在header中傳入If-None-Match將ETag返回給服務(wù)器,如果相等,服務(wù)器也會返回304,不相等則返回新的數(shù)據(jù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容