這篇文章給大家分享的是有關(guān)iOS如何實現(xiàn)文件下載的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
創(chuàng)新互聯(lián)主要從事成都網(wǎng)站制作、成都做網(wǎng)站、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)西城,10余年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575
原生態(tài)的分段下載的基本原理
文件下載往往需要比較長的一段時間,實現(xiàn)分段下載是實現(xiàn)斷點下載的前提
實現(xiàn)分段下載需要解決以下兩個問題
問題1:下載前,需要知道文件的長度
問題2:每一次請求下載文件的一段
針對問題1:HEAD請求獲取文件長度
HEAD請求只獲取響報文,而不獲取資源的實際數(shù)據(jù)
通常用來獲取文件長度、檢測服務(wù)器端資源是否發(fā)生變化
響應(yīng)對象NSURLResponse的屬性exceptedContentLength即表示文件的長度
針對問題2:請求頭參數(shù)Range進(jìn)行分段下載
HTTP協(xié)議規(guī)定,請求頭中的Range參數(shù)用于請求一段數(shù)據(jù)
如:
bytes=0-499 從0到499的頭500個字節(jié)
bytes=500-999 從500到999的第二個500字節(jié)
bytes=500- 從500字節(jié)以后的所有字節(jié)
bytes=-500 最后500個字節(jié)
bytes=500-599,800-899 同時指定幾個范圍
也就是說,分段下載,就是發(fā)送多次多次請求,每次請求設(shè)置Range字段
下面的代碼,完成一個文件的分段下載:
下面的代碼,完成文件的一段下載:
使用異步下載時,應(yīng)使用代理、通知、block進(jìn)行下載后的處理動作。
NSURLSession的下載任務(wù)
下載任務(wù)的創(chuàng)建:
- (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL*)url - (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL*)url completionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError *error))completionHandler - (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request - (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURL*location, NSURLResponse *response, NSError*error))completionHandler
NSURLSession執(zhí)行下載任務(wù)相關(guān)的代理方法:
// 周期性的調(diào)用,參數(shù)描述了下載的進(jìn)度 - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask*)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite // 下載完成時調(diào)用 - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask*)downloadTask didFinishDownloadingToURL:(NSURL *)location
示例說明:
1)創(chuàng)建NSURLSession對象并指定代理
2)創(chuàng)建下載任務(wù)并啟動
3)實現(xiàn)下載完成的代理方法:應(yīng)將下載完成后的文件移動到指定目錄并重命名
4)實現(xiàn)下載進(jìn)度監(jiān)聽的代理方法:
下載暫停/繼續(xù)的實現(xiàn)
NSURLSessionDownloadTask的暫停方法:
- (void)cancelByProducingResumeData:(void (^)(NSData *resumeData))completionHandler
參數(shù)resumeData:描述斷點信息
NSURLSession通過斷點信息創(chuàng)建下載任務(wù):
- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData - (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeDatacompletionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError*error))completionHandler
相關(guān)代理方法:
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask*)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes
實例說明:
1)下載暫停
2)下載繼續(xù)
3)斷點繼續(xù)下載的代理方法
使用AFNetworking下載
使用AFNetworking進(jìn)行下載,本質(zhì)上還是創(chuàng)建NSURLSessionDownloadTask對象
只是將代理方法的封裝到AFURLSession對象中,并用block指定行為
AFURLSessionManager創(chuàng)建下載任務(wù)
// 根據(jù)請求對象創(chuàng)建下載任務(wù) - (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request progress:(NSProgress *__nullable __autoreleasing *__nullable)progress destination:(nullable NSURL *( ^ ) ( NSURL *targetPath , NSURLResponse *response ))destination completionHandler:(nullable void ( ^ ) ( NSURLResponse *response , NSURL *filePath , NSError *error ))completionHandler
// 根據(jù)斷點信息創(chuàng)建愛下載任務(wù) - (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData progress:(NSProgress *__nullable __autoreleasing *__nullable)progress destination:(nullable NSURL *( ^ ) ( NSURL *targetPath , NSURLResponse *response ))destination completionHandler:(nullable void ( ^ ) ( NSURLResponse *response , NSURL *filePath , NSError *error ))completionHandler
參數(shù)destination:該block用于指定獲取文件下載后的路徑
參數(shù)completionHandler:該block在下載任務(wù)完成時執(zhí)行
包括任務(wù)被暫停時(cancelByProducingResumeData)
出參progress:非NULL時,會返回一個NSProgress對象,描述下載進(jìn)度
示例說明:
1)創(chuàng)建NSURLSession對象并指定代理
2)下載完成的block封裝1:應(yīng)返回下載完成的文件的最終存儲URL
3)任務(wù)完成block封裝:包括錯誤情況下的處理、成功請求下的提示等
4)下載任務(wù)的創(chuàng)建啟動/繼續(xù)
5)下載任務(wù)的暫停
使用NSProgress監(jiān)聽下載進(jìn)度
在上面的代碼中,有一個參數(shù)NSProgress類型,傳的是NULL,這個參數(shù)是AFN框架用于監(jiān)聽下載進(jìn)度
NSProgress在iOS7.0引入,使用觀察者模式
其fractionCompleted屬性值變化時,通知其所有的觀察者
示例說明:
1)下載任務(wù)的創(chuàng)建啟動/繼續(xù)
2)KVO的響應(yīng)方法
其中self.progressView是一個自定義的用于顯示下載進(jìn)度的視圖對象
下載任務(wù)常遇狀況
狀況一:程序退出時,如何保存下載狀態(tài)
下載任務(wù)管理類,注冊成為以下UIApplication對象通知的響應(yīng)者
UIApplicationDidEnterBackgroundNotification
UIApplicationWillTerminateNotification
響應(yīng)方法實現(xiàn):將所有的下載任務(wù)暫停,并將斷點信息保存到本地的操作
響應(yīng)下面通知,從本地讀出斷點信息的操作
UIApplicationWillEnterForegroundNotification
或在下載任務(wù)管理對象被創(chuàng)建時,從本地讀出斷點信息的操作
狀況二:從斷點繼續(xù)下載時,如果服務(wù)器上的文件發(fā)生變化或被刪除,應(yīng)如何處理?
可以在從斷點繼續(xù)下載前,先發(fā)送一次HEAD請求,判斷文件是否存在,以及該文件的長度是否發(fā)生變化等操作。
感謝各位的閱讀!關(guān)于“iOS如何實現(xiàn)文件下載”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!