如何做視頻網(wǎng)站的廣告推廣網(wǎng)站平臺(tái)做推廣
文章目錄
- 背景
- 介紹
- 方案及代碼
- 1、新建MAUI項(xiàng)目
- 2、建立NSUrlSession會(huì)話連接
- 3、使用NSUrlSessionDownloadTask 創(chuàng)建下載任務(wù)
- 4、DidWriteData 監(jiān)聽下載
- 5、DidFinishDownloading 完成下載
- 6、CancelDownload (取消/暫停)下載
- 7、ResumeDownload 恢復(fù)下載
- 8、殺死進(jìn)程-恢復(fù)下載
- 效果圖
- 總結(jié)
背景
最近在MAUI項(xiàng)目中碰到了大文件下載方面的需求,要求可以實(shí)現(xiàn)顯示下載進(jìn)度、暫停、繼續(xù)下載等,在開發(fā)過程中也是碰到了不少問題,所以在此簡(jiǎn)單分享使用MAUI在IOS上完成下載功能的經(jīng)驗(yàn),也希望大家少踩坑。文章中如有不妥的地方,也請(qǐng)多多指教。
介紹
NSURLSession 是 iOS 中用于處理網(wǎng)絡(luò)請(qǐng)求和數(shù)據(jù)下載的核心類之一。它提供了強(qiáng)大的功能,使應(yīng)用程序能夠與遠(yuǎn)程服務(wù)器通信、下載文件、上傳數(shù)據(jù)等。
本文我們借助NSUrlSession 中的NSUrlSessionDownloadTask來創(chuàng)建下載任務(wù)。
下載任務(wù)直接將服務(wù)器的響應(yīng)數(shù)據(jù)寫入臨時(shí)文件,在數(shù)據(jù)從服務(wù)器到達(dá)時(shí)為應(yīng)用提供進(jìn)度更新。
在后臺(tái)會(huì)話中使用下載任務(wù)時(shí),即使應(yīng)用處于掛起狀態(tài)或未運(yùn)行,這些下載也會(huì)繼續(xù)。
可以暫停(取消)下載任務(wù),稍后再恢復(fù)它們(需要服務(wù)端支持)還可以恢復(fù)由于網(wǎng)絡(luò)連接問題而失敗的下載
此方法內(nèi)部實(shí)現(xiàn)了一邊下載,一邊將下載數(shù)據(jù)寫入沙盒的操作,下載完成后會(huì)自動(dòng)刪除沙盒中的文件,所以我們需要在回調(diào)(DidFinishDownloading)中將文件移動(dòng)至其他位置進(jìn)行保存。
方案及代碼
1、新建MAUI項(xiàng)目
2、建立NSUrlSession會(huì)話連接
這里我們使用的網(wǎng)路連接類為NSUrlSession,它提供了一個(gè)用于發(fā)出網(wǎng)絡(luò)請(qǐng)求和處理異步網(wǎng)絡(luò)任務(wù)的 API并且它支持后臺(tái)傳輸。在初始化NSUrlSession之前,我們需要先創(chuàng)建NSUrlSessionConfiguration,它是NSUrlSession中的一個(gè)重要的配置,NSUrlSessionConfiguration 有三種模式:
- DefaultSessionConfiguration(默認(rèn)模式)
- BackgroundSessionConfiguration (后臺(tái)模式) :后臺(tái)模式允許你創(chuàng)建一個(gè)后臺(tái)會(huì)話,該會(huì)話可以在應(yīng)用程序處于后臺(tái)或掛起狀態(tài)時(shí)繼續(xù)進(jìn)行網(wǎng)絡(luò)請(qǐng)求。你需要提供一個(gè)唯一的標(biāo)識(shí)符(identifier),以便在應(yīng)用程序重新啟動(dòng)時(shí)恢復(fù)會(huì)話。
- EphemeralSessionConfiguration(瞬時(shí)模式) :創(chuàng)建一個(gè)臨時(shí)會(huì)話,它在請(qǐng)求結(jié)束后不會(huì)持久化任何數(shù)據(jù),包括緩存和存儲(chǔ)的憑據(jù)。適用于需要臨時(shí)性的、不需要持久化數(shù)據(jù)的請(qǐng)求,例如臨時(shí)登錄或隱私敏感的請(qǐng)求。
我們先在項(xiàng)目中新建IOSDownloadManagerService.cs然后繼承于Microsoft.iOS 中的NSUrlSessionDownloadDelegate方法,然后建立NSUrlSession會(huì)話連接,
這里我們使用BackgroundSessionConfiguration 模式創(chuàng)建后臺(tái)下載任務(wù)。
注意:無論下載多少文件,我們只需要初始化一個(gè)URLSession
3、使用NSUrlSessionDownloadTask 創(chuàng)建下載任務(wù)
這里我們使用 NSUrlSessionDownloadTask來實(shí)現(xiàn)下載,資源會(huì)下載到一個(gè)臨時(shí)文件,下載完成需將文件移動(dòng)至想要的路徑,系統(tǒng)會(huì)刪除臨時(shí)路徑文件。
4、DidWriteData 監(jiān)聽下載
開始下載后我們可以通過 重寫 DidWriteData 方法來獲取當(dāng)前正在下載的文件信息,包括 當(dāng)前的session會(huì)話、當(dāng)前的下載任務(wù)NSURLSessionDownloadTask、本次傳遞過來的數(shù)據(jù)量、目前為止下載了多少的數(shù)據(jù)等。 我們通過這些信息來計(jì)算當(dāng)前下載速度,下載進(jìn)度等。
打印下載進(jìn)度監(jiān)聽日志:
5、DidFinishDownloading 完成下載
下載完成后,會(huì)觸發(fā)DidFinishDownloading事件
通過重寫DidFinishDownloading來監(jiān)聽下載完成事件,將文件移動(dòng)到自己想保存的路徑下。
到這里我們就完成一個(gè)基礎(chǔ)的文件下載功能。當(dāng)然一個(gè)完整的下載管理功能,我們還需要具備暫停下載、恢復(fù)下載、后臺(tái)下載、殺死進(jìn)程后恢復(fù)下載等功能的支持。
6、CancelDownload (取消/暫停)下載
我們可以通過NSUrlSessionDownloadTask的Cancel方法來暫?;蛉∠螺d任務(wù),Cancel方法會(huì)回調(diào)一個(gè)NSData格式斷點(diǎn)數(shù)據(jù)給我們,然后我們可以將斷點(diǎn)數(shù)據(jù)保存起來,用于后續(xù)恢復(fù)下載。
在此之前我們需要調(diào)整 StartDownload 方法,將文件下載任務(wù)NSUrlSessionDownloadTask 存起來,用戶后續(xù)恢復(fù)下載。
CancelDownload 暫停/取消下載
注意:僅滿足以下條件時(shí),才能恢復(fù)下載:
1、首次請(qǐng)求資源以來,資源未發(fā)生更改
2、任務(wù)是 HTTP 或 HTTPS 請(qǐng)求GET
3、服務(wù)器在其響應(yīng)中提供 or 頭或者同時(shí)提供 ETagLast-Modified
4、服務(wù)器支持字節(jié)范圍請(qǐng)求
5、系統(tǒng)尚未刪除臨時(shí)文件
7、ResumeDownload 恢復(fù)下載
這里我們利用 NSUrlSession 的 CreateDownloadTask(NSData resumeData) 方法根據(jù) 斷點(diǎn)數(shù)據(jù) 創(chuàng)建一個(gè)新的下載任務(wù),以便從之前中斷的位置繼續(xù)下載。
8、殺死進(jìn)程-恢復(fù)下載
這里我們使用 DidCompleteWithError 方法來監(jiān)聽載任務(wù)錯(cuò)誤事件包括殺死進(jìn)程
當(dāng)我們的正在執(zhí)行下載任務(wù)的應(yīng)用程序被異常殺掉進(jìn)程后,重新啟動(dòng)后會(huì)進(jìn)入DidCompleteWithError方法,所以我們要想恢復(fù)下載就需要先獲取下載任務(wù)的斷點(diǎn)數(shù)據(jù),這一點(diǎn)我們可以利用本地存儲(chǔ),提前將斷點(diǎn)數(shù)據(jù)存入到本地文件中。
Maui.Essentials
DidCompleteWithError
到此,基本上大功告成了。
效果圖
總結(jié)
本文主要介紹了基于IOS下載中的幾個(gè)關(guān)鍵方法,還是主要以介紹思路為主。
為了便于展示,文章中的代碼示例拆得比較分散,大家還是以熟悉主要流程和主要方法為先,至于實(shí)現(xiàn)方式,八仙過海各顯神通。
關(guān)于NSURLSessionDownloadTask 更多的內(nèi)容請(qǐng)參考官方文檔
https://developer.apple.com/documentation/foundation/nsurlsessiondownloadtask
最后,由于文章篇幅有限,對(duì)于UI部分渲染的部分并沒有展示,由于數(shù)據(jù)渲染還是比較簡(jiǎn)單,大家可以基于Blazor實(shí)現(xiàn),也可直接使用MAUI ProgressBar等,這里就不過多介紹,對(duì)MAUI與Blazor感興趣的朋友可自行深入研究。