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