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项目


2、建立NSUrlSession会话连接
这里我们使用的网路连接类为NSUrlSession,它提供了一个用于发出网络请求和处理异步网络任务的 API并且它支持后台传输。在初始化NSUrlSession之前,我们需要先创建NSUrlSessionConfiguration,它是NSUrlSession中的一个重要的配置,NSUrlSessionConfiguration 有三种模式:
- DefaultSessionConfiguration(默认模式)
- BackgroundSessionConfiguration (后台模式) :后台模式允许你创建一个后台会话,该会话可以在应用程序处于后台或挂起状态时继续进行网络请求。你需要提供一个唯一的标识符(identifier),以便在应用程序重新启动时恢复会话。
- EphemeralSessionConfiguration(瞬时模式) :创建一个临时会话,它在请求结束后不会持久化任何数据,包括缓存和存储的凭据。适用于需要临时性的、不需要持久化数据的请求,例如临时登录或隐私敏感的请求。
我们先在项目中新建IOSDownloadManagerService.cs然后继承于Microsoft.iOS 中的NSUrlSessionDownloadDelegate方法,然后建立NSUrlSession会话连接,
这里我们使用BackgroundSessionConfiguration 模式创建后台下载任务。
注意:无论下载多少文件,我们只需要初始化一个URLSession

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

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

打印下载进度监听日志:


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

到这里我们就完成一个基础的文件下载功能。当然一个完整的下载管理功能,我们还需要具备暂停下载、恢复下载、后台下载、杀死进程后恢复下载等功能的支持。
6、CancelDownload (取消/暂停)下载
我们可以通过NSUrlSessionDownloadTask的Cancel方法来暂停或取消下载任务,Cancel方法会回调一个NSData格式断点数据给我们,然后我们可以将断点数据保存起来,用于后续恢复下载。
在此之前我们需要调整 StartDownload 方法,将文件下载任务NSUrlSessionDownloadTask 存起来,用户后续恢复下载。

CancelDownload 暂停/取消下载

注意:仅满足以下条件时,才能恢复下载:
1、首次请求资源以来,资源未发生更改
2、任务是 HTTP 或 HTTPS 请求GET
3、服务器在其响应中提供 or 头或者同时提供 ETagLast-Modified
4、服务器支持字节范围请求
5、系统尚未删除临时文件
7、ResumeDownload 恢复下载
这里我们利用 NSUrlSession 的 CreateDownloadTask(NSData resumeData) 方法根据 断点数据 创建一个新的下载任务,以便从之前中断的位置继续下载。

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

DidCompleteWithError

到此,基本上大功告成了。
效果图

总结
本文主要介绍了基于IOS下载中的几个关键方法,还是主要以介绍思路为主。
为了便于展示,文章中的代码示例拆得比较分散,大家还是以熟悉主要流程和主要方法为先,至于实现方式,八仙过海各显神通。
关于NSURLSessionDownloadTask 更多的内容请参考官方文档
https://developer.apple.com/documentation/foundation/nsurlsessiondownloadtask
最后,由于文章篇幅有限,对于UI部分渲染的部分并没有展示,由于数据渲染还是比较简单,大家可以基于Blazor实现,也可直接使用MAUI ProgressBar等,这里就不过多介绍,对MAUI与Blazor感兴趣的朋友可自行深入研究。
相关文章:
MASA MAUI iOS 文件下载与断点续传
文章目录 背景介绍方案及代码1、新建MAUI项目2、建立NSUrlSession会话连接3、使用NSUrlSessionDownloadTask 创建下载任务4、DidWriteData 监听下载5、DidFinishDownloading 完成下载6、CancelDownload (取消/暂停)下载7、ResumeDownload 恢复下载8、杀死进程-恢复下载 效果图总…...
NPDP产品经理知识(产品创新流程)
1.复习组合管理: 组合管理的目标 > 价值最大化,项目平衡,战略一致,管道平衡(资源需求和供给),盈利充分 (实现财务目标) 产品创新流程就是管理风险的过程。 模糊前端: 产品创新章程:PIC 包…...
Android日常——记一次Android事件分发需求的实现
背景:在一个事件分发复杂的view中,插入一个可点击的控件,且不能影响到本身的事件分发。 尝试: 1.对view本身设置点击事件;由于view整体是交由root view去处理分发,存在滑动、边界处理、调出其他界面等复杂操作。设置点…...
【Python】函数(function)和方法(method)的区别
这里先说结论,为了满足心急的小伙伴:method与function的最大区别就是参数有无进行绑定。 自定义类Test: 首先先来一个自定义类: class Test:def Func_normal(arg):print(Func_normal:,arg)staticmethoddef Func_static(arg):pri…...
linux入门---信号的理解
目录标题 如何理解计算机中的信号如何查看计算机中的信号初步了解信号的保存和发送如何向目标进程发送信号情景一:使用键盘发送信号情景二:系统调用发送信号情景三:硬件异常产生信号情景四:软件条件产生信号 核心转储信号的两个问…...
nn.Linear(d, num_units, bias=True)设置bias和不设置bias有什么区别?
nn.Linear(d, num_units, biasTrue)是PyTorch中定义的一个全连接线性层。其中,d是输入特征的数量,num_units是输出特征的数量,而bias参数决定是否在这个线性变换中添加一个偏置项。 设置biasTrue与biasFalse的区别如下: 数学表示…...
代码随想录 Day10 栈与队列 LeetCode T239 滑动窗口的最大值 T347 前K个高频元素
简要介绍一下单调队列和优先级队列的不同 元素顺序的处理:单调队列中,元素的顺序是单调的,也就是说,队列中的元素按照特定的单调性(递增或递减)排列。这种特性使得单调队列在处理一些问题时非常高效&#…...
vue/自定义指令
需求: 页面有个input元素,现在要鼠标光标聚焦在上面,让每个页面上的标签都可以聚焦光标,比如,从A页面跳转到B页面的时候,我们依然要聚焦。如果要一遍遍地操作dom就会很麻烦。 这个时候,为了方便…...
借用binlog2sql工具轻松解析MySQL的binlog文件,再现Oracle的闪回功能
借用binlog2sql工具轻松解析MySQL的binlog文件 简介依赖配置用户权限选项配置案例:误UPDATE表数据回滚binlog2sql VS mysqlbinlog 看腻文章了就来听听视频演示吧:https://www.bilibili.com/video/BV1Zj411k7VW/ 简介 binlog2sql是美团大众点评开源的一…...
一次解决Pytorch训练时损失和参数出现Nan或者inf的经历
目前在做实验,参考了一个新的网络架构之后发现训练时损失出现Nan,参数了出现了inf的情况,先说说我的排查经历。 首先肯定是打印损失,损失是最容易出现Nan的,有各种原因,网上也有很多解决办法,我…...
【python入门篇】列表简介及操作(2)
列表是什么? 列表是由一系列按特定顺序排列的元素组成。你可以创建包含字母表中的所有字母、数字 0~9 或所有家庭成员的列表;也可以将任何东西加入列表中,其中的元素之间可以没有任何关系。列表通常包含多个元素,因此给列表指定一…...
数据结构与算法——19.红黑树
这篇文章我们来讲一下红黑树。 目录 1.概述 1.1红黑树的性质 2.红黑树的实现 3.总结 1.概述 首先,我们来大致了解一下什么是红黑树 红黑树是一种自平衡的二叉查找树,是一种高效的查找树。红黑树具有良好的效率,它可在 O(logN) 时间内完…...
js题解(三)
文章目录 柯里化模块乘法改变上下文 柯里化 已知 fn 为一个预定义函数,实现函数 curryIt,调用之后满足如下条件: 1、返回一个函数 a,a 的 length 属性值为 1(即显式声明 a 接收一个参数) 2、调用 a 之后&a…...
CompletableFuture异步回调
CompletableFuture异步回调 CompletableFutureFuture模式CompletableFuture详解1.CompletableFuture的UML类关系2.CompletionStage接口3.使用runAsync和supplyAcync创建子任务4.设置子任务回调钩子5.调用handle()方法统一处理异常和结果6.线程池的使用 异步任务的串行执行thenA…...
Python中匹配模糊的字符串
嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 如何使用thefuzz 库,它允许我们在python中进行模糊字符串匹配。 此外,我们将学习如何使用process 模块,该模块允许我们在模糊…...
PHP图片文件管理功能系统源码
文件图库管理单PHP源码直接解压就能用,单文件,indexm.php文件可以重新命名,上传到需要访问的目录中, 可以查看目录以及各个文件,图片等和下载及修改管理服务。 源码下载:https://download.csdn.net/downloa…...
(枚举 + 树上倍增)Codeforces Round 900 (Div. 3) G
Problem - G - Codeforces 题意: 思路: 首先,目标值和结点权值是直接联系的,最值不可能直接贪心,一定是考虑去枚举一些东西,依靠这种枚举可以遍历所有的有效情况,思考的方向一定是枚举 如果去…...
websocket逆向【python实现websocket拦截】
python实现websocket拦截 前言一、拦截的优缺点优点:缺点:二、实现方法1.环境配置2.代码三、总结前言 开发者工具F12,筛选ws后,websocket的消息是这样显示的,如何获取这里面的消息呢? 以下是本篇文章正文内容 一、拦截的优缺点 主要讲解一下websocket拦截的实现,现在…...
软件测试自动化的成本效益分析
随着软件测试技术的发展,人们已经从最初的手工测试转变为手工和自动化技术相结合的测试方法。目前,人们更多的是关心自动化测试框架、自动化测试工具以及脚本研究等技术方面,而在软件自动化测试方案的效益分析方面涉及较少。 软件测试的目的是…...
【Java】状态修饰符 final static
目录 final 修饰我们的成员方法、成员变量、类 示例代码: final 修饰的局部变量 示例代码: static 示例代码: static 访问特点: 示例代码: static关键字的用途 示例代码: static 修饰常量 示例…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...
《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...
高分辨率图像合成归一化流扩展
大家读完觉得有帮助记得关注和点赞!!! 1 摘要 我们提出了STARFlow,一种基于归一化流的可扩展生成模型,它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流(TARFlow&am…...
