MASA MAUI iOS 文件下载与断点续传

文章目录

  • 背景
  • 介绍
  • 方案及代码
    • 1、新建MAUI项目
    • 2、建立NSUrlSession会话连接
    • 3、使用NSUrlSessionDownloadTask 创建下载任务
    • 4、DidWriteData 监听下载
    • 5、DidFinishDownloading 完成下载
    • 6、CancelDownload (取消/暂停)下载
    • 7、ResumeDownload 恢复下载
    • 8、杀死进程-恢复下载
  • 效果图
  • 总结

背景

最近在MAUI项目中碰到了大文件下载方面的需求,要求可以实现显示下载进度、暂停、继续下载等,在开发过程中也是碰到了不少问题,所以在此简单分享使用MAUI在IOS上完成下载功能的经验,也希望大家少踩坑。文章中如有不妥的地方,也请多多指教。

介绍

NSURLSession 是 iOS 中用于处理网络请求和数据下载的核心类之一。它提供了强大的功能,使应用程序能够与远程服务器通信、下载文件、上传数据等。
本文我们借助NSUrlSession 中的NSUrlSessionDownloadTask来创建下载任务。
下载任务直接将服务器的响应数据写入临时文件,在数据从服务器到达时为应用提供进度更新。
在后台会话中使用下载任务时,即使应用处于挂起状态或未运行,这些下载也会继续。
可以暂停(取消)下载任务,稍后再恢复它们(需要服务端支持)还可以恢复由于网络连接问题而失败的下载
此方法内部实现了一边下载,一边将下载数据写入沙盒的操作,下载完成后会自动删除沙盒中的文件,所以我们需要在回调(DidFinishDownloading)中将文件移动至其他位置进行保存。

方案及代码

1、新建MAUI项目

image.png
image.png

2、建立NSUrlSession会话连接

这里我们使用的网路连接类为NSUrlSession,它提供了一个用于发出网络请求和处理异步网络任务的 API并且它支持后台传输。在初始化NSUrlSession之前,我们需要先创建NSUrlSessionConfiguration,它是NSUrlSession中的一个重要的配置,NSUrlSessionConfiguration 有三种模式:

  • DefaultSessionConfiguration(默认模式)
  • BackgroundSessionConfiguration (后台模式) :后台模式允许你创建一个后台会话,该会话可以在应用程序处于后台或挂起状态时继续进行网络请求。你需要提供一个唯一的标识符(identifier),以便在应用程序重新启动时恢复会话。
  • EphemeralSessionConfiguration(瞬时模式) :创建一个临时会话,它在请求结束后不会持久化任何数据,包括缓存和存储的凭据。适用于需要临时性的、不需要持久化数据的请求,例如临时登录或隐私敏感的请求。

我们先在项目中新建IOSDownloadManagerService.cs然后继承于Microsoft.iOS 中的NSUrlSessionDownloadDelegate方法,然后建立NSUrlSession会话连接
这里我们使用BackgroundSessionConfiguration 模式创建后台下载任务。
注意无论下载多少文件,我们只需要初始化一个URLSession
image.png

3、使用NSUrlSessionDownloadTask 创建下载任务

这里我们使用 NSUrlSessionDownloadTask来实现下载,资源会下载到一个临时文件,下载完成需将文件移动至想要的路径,系统会删除临时路径文件。
image.png

4、DidWriteData 监听下载

开始下载后我们可以通过 重写 DidWriteData 方法来获取当前正在下载的文件信息,包括 当前的session会话、当前的下载任务NSURLSessionDownloadTask、本次传递过来的数据量、目前为止下载了多少的数据等。 我们通过这些信息来计算当前下载速度,下载进度等。
image.png

打印下载进度监听日志

image.png
image.png

5、DidFinishDownloading 完成下载

下载完成后,会触发DidFinishDownloading事件
通过重写DidFinishDownloading来监听下载完成事件,将文件移动到自己想保存的路径下。
image.png

到这里我们就完成一个基础的文件下载功能。当然一个完整的下载管理功能,我们还需要具备暂停下载、恢复下载后台下载、杀死进程后恢复下载等功能的支持。

6、CancelDownload (取消/暂停)下载

我们可以通过NSUrlSessionDownloadTaskCancel方法来暂停或取消下载任务,Cancel方法会回调一个NSData格式断点数据给我们,然后我们可以将断点数据保存起来,用于后续恢复下载。
在此之前我们需要调整 StartDownload 方法,将文件下载任务NSUrlSessionDownloadTask 存起来,用户后续恢复下载。
image.png
CancelDownload 暂停/取消下载
image.png

注意:仅满足以下条件时,才能恢复下载:
1、首次请求资源以来,资源未发生更改
2、任务是 HTTP 或 HTTPS 请求GET
3、服务器在其响应中提供 or 头或者同时提供 ETagLast-Modified
4、服务器支持字节范围请求
5、系统尚未删除临时文件

7、ResumeDownload 恢复下载

这里我们利用 NSUrlSessionCreateDownloadTask(NSData resumeData) 方法根据 断点数据 创建一个新的下载任务,以便从之前中断的位置继续下载。
image.png

8、杀死进程-恢复下载

这里我们使用 DidCompleteWithError 方法来监听载任务错误事件包括杀死进程
当我们的正在执行下载任务的应用程序被异常杀掉进程后,重新启动后会进入DidCompleteWithError方法,所以我们要想恢复下载就需要先获取下载任务的断点数据,这一点我们可以利用本地存储,提前将断点数据存入到本地文件中。
Maui.Essentials
image.png
DidCompleteWithError
image.png
到此,基本上大功告成了。

效果图

fcli2-ikon4.gif

总结

本文主要介绍了基于IOS下载中的几个关键方法,还是主要以介绍思路为主。
为了便于展示,文章中的代码示例拆得比较分散,大家还是以熟悉主要流程和主要方法为先,至于实现方式,八仙过海各显神通。

关于NSURLSessionDownloadTask 更多的内容请参考官方文档

https://developer.apple.com/documentation/foundation/nsurlsessiondownloadtask

最后,由于文章篇幅有限,对于UI部分渲染的部分并没有展示,由于数据渲染还是比较简单,大家可以基于Blazor实现,也可直接使用MAUI ProgressBar等,这里就不过多介绍,对MAUI与Blazor感兴趣的朋友可自行深入研究。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/143163.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

登录业务实现 - token登录鉴权

登录业务实现: 登录成功/失败实现 -> pinia管理用户数据及数据持久化 -> 不同登录状态的模板适配 -> 请求拦截器携带token(登录鉴权) -> 退出登录实现 -> token失效(401响应拦截) 1. 登录成…

Spring Boot 3.0:构建下一代Java应用的新方法

文章目录 Spring Boot 3.0:一览1. **模块化应用程序**2. **更强大的自动化工具**3. **更强大的安全性**4. **更好的性能和扩展性** 如何开始使用Spring Boot 3.01. 安装Spring Boot CLI2. 创建新项目3. 配置应用程序4. 编写业务逻辑5. 测试应用程序6. 构建和部署 结…

记录使用iText7查找PDF内容关键字坐标,加盖电子签名、印章

一、前言 项目以前签字都是由C端那边进行合成操作,最近项目要求把那块功能,由后端进行实现,其中包含坐标、关键字、任意位置进行签字操作,坐标是最容易实现的,曾经也写过类似的功能在(添加图片印章到PDF&a…

印章篆刻小程序商城的作用是什么

印章的需求度也有很高市场需求,处理办公印章外,还有艺术类的,而对爱好者来说,需要找到一家靠谱的品牌制作,包括材料、样式、内容等都有较高要求,线上可以接触到更多雕刻商家。 而对品牌来说,需…

org.postgresql.util.PSQLException: Bad value for type long

项目用 springbootmybatis mybatisplus, 数据库是:postgresql 。 执行查询时候返回错误。 org.springframework.dao.DataIntegrityViolationException: Error attempting to get column city_id from result set. Cause: org.postgresql.util.PSQLExce…

华为云Stack的学习(七)

八、华为云Stack存储服务介绍 1.云硬盘EVS 云硬盘(Elastic Volume Service,EVS),又名磁盘,是一种虚拟块存储服务,主要为ECS(Elastic Cloud Server)和BMS(Bare Metal Se…

RabbitMQ消息可靠性保证机制--发送端确认

发送端确认机制 ​ RabbitMQ后来引入了一种轻量级的方式,叫发送方确认(publisher confirm)机制,生产者将信息设置成confirm(确认)模式,一旦信道进入了confirm模式,所有在该信道上面发送的消息都会被指派成…

对比接口测试工具在自动化测试优缺点:Jmeter、Python、Postman

一、JMeter 总结:适合对代码不敏感的使用人员,不会代码也可以完成接口自动化,设计框架。适合紧急迭代的项目。 JMeter接口测试的优势 小巧轻量级,并且开源免费,社区接受度高,比较容易入门支持多协议&…

数字音频工作站FL Studio 21中文版下载及电音编曲要用乐理吗 电音编曲步骤

FL Studio 21是一款强大的数字音频工作站(DAW)软件,为您提供一个完整的软件音乐制作环境。它是制作高质量的音乐、乐器、录音等的完整解决方案。该程序配备了各种工具和插件,帮助你创建专业的虚拟乐器,如贝斯、吉他、钢…

Unity vscode 官方debug

把这个先unlock 再升级到最新的 然后重新生成 project files 打开 launch.json {"version": "0.2.0","configurations": [{"name": "Attach to Unity","type": "vstuc","request": "a…

如何一键提取微信背景图?

微信图文中的背景图,就像室内装修中的墙纸。使用不同颜色、图案的背景图能让文章更有质感,更立体,能给读者带来不一样的视觉体验。那看到其他公众号用的背景图很好看,自己也想用,怎么办?(以速排…

香港云服务器和日本云服务器哪个好?(详细对比)

​  购置海外服务器时,您是在乎网络速度?价格?稳定性?当这几个因素同时存在,我们该如何选择?本篇针对海外热门的两个地区,中国香港和日本,这两种云服务器谁优谁劣?各有什么亮点?逐一进行对比分析。 一、速度上来看 中国香…

下划线在键盘上怎么打?这3个方法快收藏!

“我最近的工作中好像很多文件里都有下划线,但是我不知道在键盘上应该怎么把下划线打出来,有没有知道的朋友呀?” 在计算机文档和编程中,下划线是一个常见的特殊字符。很多用户在使用电脑时可能也经常需要用到下划线。但是下划线在…

前端开发之服务器的基本概念与初识Ajax

1,服务器的基本概念与初识Ajax 1.1 URL地址的组成部分 1.2 客户端与服务器的通信过程 1.3 网页中如何请求数据 1.4 $.get()函数 1.4.1 $.get()函数的语法 // jQuery 中 $.get() 函数的功能单一,专门用来发起 get 请求,从而将服务器上的资源…

接口测试——接口协议抓包分析与mock_L2

目录: 抓包工具charles抓包工具fiddler抓包工具证书配置app抓包实战练习接口测试实战练习 1.抓包工具charles 工具介绍 支持 SSL 代理支持流量控制支持重发网络请求,方便后端调试支持修改网络请求参数支持网络请求的截获并动态修改可以自动将 json 或…

as 加载aar(包含so文件)遇到问题的解决方法

""" r java.lang.UnsatisfiedLinkEnror :No implementation found for void com.example.myapplication2.Model.init(java.lang .Storing, java.lang .string) 原来是so文件里的Model类的所属的包名,跟我java里的不一样。linux里,可以用 …

C++11之可变参数模板

可变参数模板 可变参数模板概念可变参数模板定义参数包展开方式递归展开参数包逗号表达式展开参数包 STL容器中的emplace相关接口函数 可变参数模板概念 C11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板,相比C98/03,类模版和函…

铁红面建筑模板:木质之美与实用性的结合

铁红面建筑模板,又称为铁红面板或酚醛面建筑模板,是一种常用的建筑施工材料。其主要特点是选用进口辐射松、樟子松或国内的马尾松旋切木材作为面皮,经过胶机上的面胶和热压机的压合而成。这种建筑模板在施工中发挥着重要的作用,并…

基于ModebusRTU通信采集温度湿度项目案例

目录 一、模拟温湿度模拟 【1.1】温湿度仪表参数 【1.1】使用电脑模拟传感器 【1.2】使用Codesys软件模拟传感器 二、自定义控件UI设计 【2.1】自定义控件温度湿度柱状设计 ​编辑 【2.1.1】设置温度湿度柱状实际显示【属性】 【2.1.2】设置温度湿度柱状的背景颜色【属…

win10系统 C++环境 安装编译GRPC

第一步 下载源码、更新、cmake编译: 为了依赖的成功安装,采用gitee进行下载与更新。记得需要安装git软件。 安装命令: 在自己指定的目录下,鼠标右键,选择 git Bash Here 打开命令行 git clone -b v1.34.0 https://gi…