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 修饰常量 示例…...
在Windows电脑上体验酷安社区:酷安UWP桌面版完全指南
在Windows电脑上体验酷安社区:酷安UWP桌面版完全指南 【免费下载链接】Coolapk-UWP 一个基于 UWP 平台的第三方酷安客户端 项目地址: https://gitcode.com/gh_mirrors/co/Coolapk-UWP 你是否曾经想过,如果能在电脑上刷酷安会是怎样的体验…...
BugPack:构建自动化安全研究工具箱的设计与实践
1. 项目概述:一个为安全研究量身定制的“漏洞工具箱”如果你是一名安全研究员、渗透测试工程师,或者是对软件安全有浓厚兴趣的开发者,那么你一定经历过这样的场景:在复现一个公开漏洞时,需要四处寻找可用的利用脚本&am…...
解决ROS的‘Done checking log file disk usage’卡顿:你的~/.bashrc里ROS_IP设对了吗?
解决ROS日志检查卡顿:环境变量配置的深层解析与实战指南 当你在终端启动roscore时,是否遇到过长时间卡在"Done checking log file disk usage"提示的尴尬?这个问题看似简单,背后却隐藏着ROS环境配置的关键细节。本文将带…...
Laravel Permission 缓存系统终极指南:如何构建高性能多级缓存策略
Laravel Permission 缓存系统终极指南:如何构建高性能多级缓存策略 【免费下载链接】laravel-permission Associate users with roles and permissions 项目地址: https://gitcode.com/gh_mirrors/la/laravel-permission Laravel Permission 是一个功能强大的…...
基于RAG架构的企业级AI知识库:从原理到部署实战
1. 项目概述:一个AI驱动的企业级知识管理新范式最近在探索企业知识库与AI结合的实际落地方案时,我注意到了GitHub上一个名为akshata29/entaoai的项目。这个项目名称本身就是一个很好的线索:“entao” 很容易让人联想到 “Enterprise AI”&…...
为什么需要做GEO优化?AI新时代的商业规则探索
2026年,一个加速蔓延的商业现象正在发生:消费者不再打开搜索引擎、翻阅列表、逐条点击蓝色链接——他们直接打开DeepSeek、豆包、Kimi等AI助手,用一句完整的话发起提问:“这个价位哪个品牌最值得买?”“敏感肌用什么护…...
云代理商:Hermes Agent如何通过技能沉淀降低长期算力消耗
在 AI 智能体规模化落地的今天,算力成本高、重复推理多、长期运行效率衰减,已成为企业和开发者的核心痛点。传统 AI 智能体每处理一次相似任务,都要从零开始推理、反复调用工具,大量算力浪费在重复劳动中,长期使用成本…...
数字示波器原理与高频信号测量实战指南
1. 数字示波器基础:从原理到实战的完整指南作为电子工程师的"眼睛",示波器在电路调试、信号分析和故障诊断中扮演着不可替代的角色。记得我第一次使用数字示波器测量高速串行信号时,面对屏幕上扭曲的波形完全不知所措——后来才发现…...
AI 重构泳装产业,先智先行如何破解行业痛点
春夏季泳装市场需求旺盛,但多数企业深陷效率与成本双重焦虑:设计周期冗长、打板损耗偏高、营销内容同质化严重,难以快速响应潮流变化。北京先智先行科技有限公司聚焦 AI 技术赋能,推出 “先知大模型”“先行 AI 商学院”“先知 AI…...
Node.js 服务端项目如何集成 Taotoken 实现稳定大模型调用
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Node.js 服务端项目如何集成 Taotoken 实现稳定大模型调用 在构建现代服务端应用时,集成大模型能力已成为提升产品智能…...
