iOS斷點續(xù)傳和后臺下載(基于AFNetworking)

---2018-09-5補充-----

1.如果使用斷點續(xù)傳,不僅僅是客戶端的工作,還需要服務(wù)器支持?jǐn)帱c續(xù)傳功能,否則無法生成正確的resumeData,
如何驗證服務(wù)器是否支持?jǐn)帱c續(xù)傳呢?
我們可以通過下載文件的時候的響應(yīng)頭來查看:
根據(jù) 蘋果官方文檔描述:

image.png

滿足上述條件的 才能使用斷點續(xù)傳功能
其次,使用斷點續(xù)傳的時候,客戶端請求的range是比如說是 19799+ ,服務(wù)器此時返回的文件的部分?jǐn)?shù)據(jù),服務(wù)器響應(yīng)碼必須是 206,不可以是200或者其他狀態(tài)碼,否則客戶端會從頭下載,

---2018-09-5補充-----

先說說斷點續(xù)傳 :

最近重構(gòu)公司代碼,公司需要做文件的斷點續(xù)傳,看了下之前的代碼和網(wǎng)上的代碼,大家還有好多是使用的NSURLConnection,


image.png

,一點一點的拼接data,然后斷開連接,再次連接的時候,將本地的data的長度,塞到請求頭里面設(shè)置range
[request setValue:rangeString forHTTPHeaderField:@"Range"];
這種的,但是我們的網(wǎng)絡(luò)請求是封裝的AFNetworking的,也發(fā)現(xiàn)AFNetworking也有NSURLSessionDownLoadTask,我們就拿過來接著就用了,其實AFNetworking也支持?jǐn)帱c續(xù)傳,而且支持的我感覺還是很完美的.

---2019-01-24補充----
如果是做下載工具或者使用的默認(rèn)的defaultConfig的話,需要注意一下iOS默認(rèn)的限制同一個服務(wù)器tcp連接的并發(fā)數(shù)量限制,否則會發(fā)現(xiàn) ,無論創(chuàng)建多少下載任務(wù),都是4個或者6個在運行,其他的在排隊,甚至還最后直接超時了
我整理了一下并發(fā)的一些基礎(chǔ)的個人理解: NSURLSession的最大并發(fā) HTTPMaximumConnectionsPerHost屬性使用場景
---2019-01-24補充----

首先,我們創(chuàng)建一個管理下載的manager及下載的配置,注意那個后臺任務(wù)的backgroundSessionConfigurationWithIdentifier是要確定的,要后臺下載的時候使用

image.png
image.png

注意代碼中的一個AF的通知監(jiān)聽,特別重要,后臺下載的回調(diào)及下載成功失敗的回調(diào),都是在這個通知里面(其實是AFNetworking封裝了,把回調(diào)信息都是通過通知傳遞的,在這里真的佩服AFNetworking作者,把通知用的這么出神入化,我是在這里重新對通知的認(rèn)知提高了一個大的階段,這里只是上了一點發(fā)送通知的地方,通知的userInfo帶了很多東西,詳細(xì)的大家可以看下AF的源碼)

AFURLSessionManager開始一個下載的時候,有兩個方法,分別是開始下載(重頭下載),繼續(xù)下載(需要傳入一個resumeData)


image.png

看方法名,作者就給我們做了斷點續(xù)傳的功能

介紹完這兩個方法名,我們介紹下第一個方法是怎么使用,和第二個是什么使用的,并且resumeData是在哪里獲取的

1.當(dāng)我們需要下載的時候,主動去調(diào)用downloadTaskWithRequest方法,根據(jù)下載地址url,去判斷本地是否有resumeData,這個類似SDWebImage的實現(xiàn),我們自己去維護(hù)這個對應(yīng)關(guān)系,可以存到本地一個plist文件里面,鍵值對對應(yīng) url:resumeData ,

  1. 開始下載的時候,去判斷當(dāng)前是否存在這個url:resumeData,存在的話,看一下長度是否大于零(當(dāng)用戶開始下載的時候,如果什么都沒下載到,就中斷下載,resumeData是nil,如果直接寫入plist是會崩潰的,我們可以寫一個空字符串,雖然不是一個類型,但是length都可以使用,不會太影響),大于零,就使用resumeData調(diào)用downloadTaskWithResumeData這個方法,然后去開始我們的任務(wù)
image.png

上面是兩個基本的方法介紹,這里介紹一下那個ResumeData在哪里獲取,什么時候獲取,
還是上面提到的那個通知 (是在NSURLSessionTaskDelegate 這個協(xié)議里面的- (void)URLSession:(__unused NSURLSession *)session
task:(NSURLSessionTask *)task
didCompleteWithError:(NSError *)error 這個方法發(fā)出了的,其實downLoadTask的成功,失敗,中斷都會調(diào)用這個方法),所以,我們需要去剛剛那個通知里面去看看到底都傳過來什么.

image.png

拿到了這個ResumeData,大家就可以區(qū)分使用什么時候開始斷點續(xù)傳,什么時候重新下載了

大家可以主動去將task 提前結(jié)束來觸發(fā)那個通知,一般不允許蜂窩下載的時候,會用到這個方法

image.png

后臺下載 :

后臺下載呢,其實上面初始化那個manger的時候,配置那個后臺配置的時候,已經(jīng)實現(xiàn)了后臺下載的過程,你可以嘗試下,你調(diào)回前臺,你的下載也在繼續(xù),只是這個時候,你的session被操作系統(tǒng)接過去了,操作系統(tǒng)去管理了,一旦你下載完成,會通知你(如果你的app還活著的時候),那么你的app死了的時候怎么辦呢,操作系統(tǒng)會給你留著,持有者,等你的app再次復(fù)活的時候,并且再次創(chuàng)建NSURLSessionConfiguration,有后臺任務(wù),并且后臺的backgroundSessionConfigurationWithIdentifier一致的話,操作系統(tǒng)會去調(diào)用你的原來的NSURLSessionTaskDelegate代理中的task的didCompleteWithError的方法,由于我們的使用的是AF封裝的,所以那個代理被AF接到并且提供了回調(diào)API的Block组砚,同時也通過通知處理了,所以還是會在我們之前監(jiān)聽的那個通知里面,和我們app活著的時候一樣一樣的,去發(fā)送那個AFNetworkingTaskDidCompleteNotification的通知,在這里 我們原來的處理邏輯不需要改變,

上面講的是我們進(jìn)入后臺,app慢慢的被系統(tǒng) 殺死 或者沒殺死的時候,那么,如果我正在下載著,app崩潰,或者被用戶手動強退怎么辦? 經(jīng)過驗證,其實是一樣的,出現(xiàn)這個情況后,操作系統(tǒng)監(jiān)聽到被殺死或者被中斷,也會幫我們持有這個session,然后把崩潰的一瞬間的ResumeData存著,等待我們再次創(chuàng)建相同后綴的session,那時候在調(diào)用回調(diào)---->af再發(fā)通知---->我們再存起來.


image.png

講了這么多,大家是不是特別好奇,這個resumeData到底是什么?
其實resumeData是一個data類型,大家可以轉(zhuǎn)成字符串,看一下里面的內(nèi)容
他的本質(zhì)是一個xml文件
AF在下載的時候(其實是調(diào)用的系統(tǒng)的下載方法),會將文件先下載到沙盒目錄下的temp文件夾中,生成一個后綴為tmp的文件,等我們下載完的時候,會將文件處理,然后移動到我們下載時設(shè)置的路徑下,這樣,我們的下載任務(wù)就完成了,

image.png

在上面的xml文件中,大家可以看到下載的url,當(dāng)前接受的文件大小,第幾次下載,還有臨時文件名等信息,其實本質(zhì)還是萬變不離其宗,但是感覺這樣用起來挺好的,既然用了AF了,就用到底吧,這樣 ,我們基本的斷點續(xù)傳和后臺下載是說完了,有錯誤希望大家指出,共同進(jìn)步,謝謝
對了,參考過一個同學(xué)關(guān)于后臺下載的講解,大家可以看一下
參考文章 http://www.reibang.com/p/1211cf99dfc3
附帶個人的demo地址 : https://github.com/yangfangkuo/downLoadTest/tree/master
對大家致敬,感謝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蝎宇,隨后出現(xiàn)的幾起案子饼齿,更是在濱河造成了極大的恐慌捞蚂,老刑警劉巖缺菌,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件焕窝,死亡現(xiàn)場離奇詭異厌均,居然都是意外死亡棒呛,警方通過查閱死者的電腦和手機(jī)葡公,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來条霜,“玉大人催什,你說我怎么就攤上這事。” “怎么了蒲凶?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵气筋,是天一觀的道長。 經(jīng)常有香客問我旋圆,道長宠默,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任灵巧,我火速辦了婚禮搀矫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘刻肄。我一直安慰自己瓤球,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布敏弃。 她就那樣靜靜地躺著卦羡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪麦到。 梳的紋絲不亂的頭發(fā)上绿饵,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機(jī)與錄音瓶颠,去河邊找鬼拟赊。 笑死,一個胖子當(dāng)著我的面吹牛粹淋,可吹牛的內(nèi)容都是我干的吸祟。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼廓啊,長吁一口氣:“原來是場噩夢啊……” “哼欢搜!你這毒婦竟也來了封豪?” 一聲冷哼從身側(cè)響起谴轮,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吹埠,沒想到半個月后第步,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡缘琅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年粘都,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刷袍。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡翩隧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出呻纹,到底是詐尸還是另有隱情堆生,我是刑警寧澤专缠,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站淑仆,受9級特大地震影響涝婉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蔗怠,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一墩弯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寞射,春花似錦渔工、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至策治,卻和暖如春脓魏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背通惫。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工茂翔, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人履腋。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓珊燎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親遵湖。 傳聞我的和親對象是個殘疾皇子悔政,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容