iOS开发网络篇—文件下载(暂停和恢复)

iOS m3u8本地缓存播放(控制下载并发、暂停恢复) 一m3u8缓存播放的整个流程 二控制媒体下载的并发数 三控制单个媒体的切片下载并发数 四下载的中断和恢复总结下任务生命周期中的任务状态变化 五注意的问题与思路延伸一、m3u8缓存播放的整个流程1.下载m3u8文件 2.解析m3u8文件获取视频切片单元的信息。 3.根据2.获取的视频切片信息中的切片链接下载切片并保持到本地。 3.根据获取的切片信息与本地服务器的配置信息,拼接出切片的本地地址、生 阅读详情

原地址:http://www.cnblogs.com/wendingding/p/3819236.html


一、Range简单说明

通过设置请求头Range可以指定每次从网路下载数据包的大小

Range示例

bytes=0-499 从0到499的头500个字节

bytes=500-999 从500到999的第二个500字节

bytes=500- 从500字节以后的所有字节 

bytes=-500 最后500个字节

bytes=500-599,800-899 同时指定几个范围

Range小结

- 用于分隔

前面的数字表示起始字节数

后面的数组表示截止字节数,没有表示到末尾

, 用于分组,可以一次指定多个Range,不过很少用

二、代码示例

复制代码
  1 #import "YYViewController.h"
  2 
  3 @interface YYViewController ()
  4 //文件数据
  5 @property(nonatomic,strong)NSMutableData *fileData;
  6 //文件句柄
  7 @property(nonatomic,strong)NSFileHandle *writeHandle;
  8 //当前获取到的数据长度
  9 @property(nonatomic,assign)long long currentLength;
 10 //完整数据长度
 11 @property(nonatomic,assign)long long sumLength;
 12 //是否正在下载
 13 @property(nonatomic,assign,getter = isdownLoading)BOOL downLoading;
 14 //请求对象
 15 @property(nonatomic,strong)NSURLConnection *cnnt;
 16 //获取按钮
 17 @property (weak, nonatomic) IBOutlet UIButton *btn;
 18 //获取进度条
 19 @property (weak, nonatomic) IBOutlet UIProgressView *progress;
 20 //按钮点击事件
 21 - (IBAction)star;
 22 
 23 @end
 24 
 25 @implementation YYViewController
 26 
 27 - (void)viewDidLoad
 28 {
 29     [super viewDidLoad];
 30 }
 31 
 32 - (IBAction)star {
 33     //当下载完成后,点击按钮文字变为已下载
 34 
 35     //判断当前是否正在下载
 36     if (self.isdownLoading) {//如果当前正在下载,那么点击按钮,按钮变为暂停状态
 37         [self.btn setTitle:@"下载" forState:UIControlStateNormal];
 38         self.downLoading=NO;
 39         
 40         //取消发送请求
 41         [self.cnnt cancel];
 42         self.cnnt=nil;
 43     }else
 44     {//如果当前没有下载,那么点击按钮,开始或者是继续下载
 45         [self.btn setTitle:@"暂停" forState:UIControlStateNormal];
 46         self.downLoading=YES;
 47         //创建下载路径
 48         NSURL *url=[NSURL URLWithString:@"http://192.168.1.53:8080/MJServer/resources/video.zip"];
 49         
 50         //创建一个请求
 51 //        NSURLRequest *request=[NSURLRequest requestWithURL:url];
 52         NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];
 53         
 54         //设置请求头信息
 55         //self.currentLength字节部分重新开始读取
 56         NSString *value=[NSString stringWithFormat:@"bytes=%lld-",self.currentLength];
 57         [request setValue:value forHTTPHeaderField:@"Range"];
 58         
 59         //发送请求(使用代理的方式)
 60         self.cnnt=[NSURLConnection connectionWithRequest:request delegate:self];
 61 //        [self.cnnt start];
 62     }
 63 }
 64 
 65 #pragma mark- NSURLConnectionDataDelegate代理方法
 66 /*
 67  *当接收到服务器的响应(连通了服务器)时会调用
 68  */
 69 -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
 70 {
 71 #warning 判断是否是第一次连接
 72     if (self.sumLength) return;
 73     
 74     //1.创建文件存数路径
 75     NSString *caches=[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
 76     NSString *filePath=[caches stringByAppendingPathComponent:@"video.zip"];
 77 
 78     
 79     
 80     //2.创建一个空的文件,到沙盒中
 81     NSFileManager *mgr=[NSFileManager defaultManager];
 82     //刚创建完毕的大小是o字节
 83     [mgr createFileAtPath:filePath contents:nil attributes:nil];
 84     
 85     //3.创建写数据的文件句柄
 86     self.writeHandle=[NSFileHandle fileHandleForWritingAtPath:filePath];
 87     
 88     //4.获取完整的文件长度
 89     self.sumLength=response.expectedContentLength;
 90 }
 91 
 92 /*
 93  *当接收到服务器的数据时会调用(可能会被调用多次,每次只传递部分数据)
 94  */
 95 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
 96 {
 97     //累加接收到的数据长度
 98     self.currentLength+=data.length;
 99     //计算进度值
100     double progress=(double)self.currentLength/self.sumLength;
101     self.progress.progress=progress;
102     
103     
104     //一点一点接收数据。
105     NSLog(@"接收到服务器的数据!---%d",data.length);
106     //把data写入到创建的空文件中,但是不能使用writeTofile(会覆盖)
107     //移动到文件的尾部
108     [self.writeHandle seekToEndOfFile];
109     //从当前移动的位置,写入数据
110     [self.writeHandle writeData:data];
111 }
112 
113 /*
114  *当服务器的数据加载完毕时就会调用
115  */
116 -(void)connectionDidFinishLoading:(NSURLConnection *)connection
117 {
118     NSLog(@"下载完毕----%lld",self.sumLength);
119     //关闭连接,不再输入数据在文件中
120     [self.writeHandle closeFile];
121     self.writeHandle=nil;
122     
123     //清空进度值
124     self.currentLength=0;
125     self.sumLength=0;
126     
127     //设置按钮文字为“已经下载完成”
128     [self.btn setTitle:@"已经下载完成" forState:UIControlStateNormal];
129     [self.btn setEnabled:NO];
130 }
131 /*
132  *请求错误(失败)的时候调用(请求超时\断网\没有网\,一般指客户端错误)
133  */
134 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
135 {
136 }
137 @end
复制代码

注意:关键代码

        从self.currentLength字节部分重新开始读取

        NSString *value=[NSString stringWithFormat:@"bytes=%lld-",self.currentLength];

        [request setValue:value forHTTPHeaderField:@"Range"];

模拟器运行情况:

程序启动界面:

点击下载按钮后,开始下载文件,此时按钮的提示文字变为暂停。

下载暂停后,点击下载按钮,继续之前的下载。

下载完成后界面效果:

下载完成后,查看项目沙盒:

标签:  IOS开发,  网络篇

MASA MAUI iOS 文件下载与断点续传 是 iOS 中用于处理网络请求和数据下载的核心类之一。它提供了强大的功能,使应用程序能够与远程服务器通信、下载文件、上传数据等。本文我们借助中的来创建下载任务。下载任务直接将服务器的响应数据写入临时文件,在数据从服务器到达时为应用提供进度更新。在后台会话中使用下载任务时,即使应用处于挂起状态或未运行,这些下载也会继续。可以暂停(取消)下载任务,稍后再恢复它们(需要服务端支持)还可以恢复由于网络连接问题而失败的下载。 阅读详情

相关推荐

ios-视频下载列表效果现实.zip

开发作者:吴海超 iOS交流群:302157745 最新最好用的自动布局库Autolayout :https://github.com/netyouli/WHC_AutoLayoutKit 最新版专业级下载网络开源库:https://github.com/netyouli/WHCNetWorkKit 你们的支持是我前进的动力!

关于iOS的后台下载和断点续传,说一说自己的理解(二,接上篇)

因为上一篇有一些细节还是没有说透,特别是断点续传这里,继续和大家聊一聊这里面的问题。 1. 关于resumedata的bug, 目前苹果在10.2中已经解决了,也就是说做适配的同学只需要额外考虑10.x和10.1.x版本。 2. 对于程序被用户手动kill和因代码原因触发的crash,后台下载恢复的行为是不同的(当然,恢复的行为都是基于同一id的backgroundsession): a.用户

openglnewbee的博客 1605

ios 列表实现

ios 列表实现

iOS 大文件下载、断点续传、后台下载 —— HERO博客

本篇简述一下实现文件下载功能,包含大文件下载,后台下载,杀死进程,重新启动时继续下载,设置下载并发数,监听网络改变等,并在最后附有Demo。下载功能的实现:使用的网络连接的类为NSURLSession。该类用以替代NSURLConnection,在iOS7时推出,至此iOS系统才有了后台传输。在初始化NSURLSession前,需要先创建NSURLSessionConfiguration,可以理解...

hero_wqb的博客 1万+

ios列表自定义

ios列表自定义,cell重用和自定义

【Nature Communications】超高介电常数材料 Hf0.5Zr0.5O2(HZO)

复旦大学AnQuanJiang团队在《NatureCommunications》发表研究,通过原子层沉积技术制备Hf0.5Zr0.5O2(HZO)薄膜电容器,结合等离子体处理获得突破性性能:介电常数达921,储能密度584J/cm³,效率近100%。研究揭示了铁电性消失后氧空位有序排列产生超高介电常数的机制,并通过同步辐射衍射和STEM分析证实了微观结构转变。该材料在85-300K温度范围内保持稳定,经1万亿次循环后仍能维持100μC/cm²电荷密度,为高密度DRAM和CMOS器件集成提供了新方案。

荷塘阅色 2453

iOS-大文件下载、断点续传实现

请求头Range 实现断点续传要了解HTTP请求头Range,通过设置Range可以指定每次从网络下载数据包的大小 Range大小设置 bytes=0-499 ,从0到499的头500个字节 bytes=500-999,从500到999的第二个500字节 bytes=500- ,从500字节以后的所有字节 bytes=-500, 最后500个字节 bytes=500-599,800-89...

samuelandkevin的专栏 1515

Fluent新手避坑:遇到‘Floating point exception’别慌,这7个排查步骤帮你搞定

本文为Fluent新手提供了7个排查'Floating point exception'错误的实用步骤,包括边界条件检查、时间步长优化、求解器配置等关键技巧。通过系统化的诊断流程,帮助用户快速定位并解决CFD仿真中的浮点异常问题,提升计算稳定性。

weixin_42531886的博客 285

下载好的python怎么打开-python下载文件的三种方法

Python开发中时长遇到要下载文件的情况,最常用的方法就是通过Http利用urllib或者urllib2模块。当然你也可以利用ftplib从ftp站点下载文件。此外Python还提供了另外一种方法requests。下面来看看三种方法是如何来下载zip文件的:方法一:import urllibimport urllib2import requestsprint"downloading w...

weixin_37988176的博客 1087

5G初始注册流程详解(2)-Registration Request

1:了解注册的本质,5G终端为什么要注册? 2:SUCI,SUPI,5G-GUTI的区别? 3:为什么会有COMPLETE REGISTRATION REQUEST呢?

weixin_53220301的博客 3794

SAP FIORI静态磁贴从零到一:配置实战与权限打通

本文详细介绍了SAP FIORI静态磁贴的配置流程与权限管理,从准备工作到后台配置、目标映射、前台组织及权限分配,提供了实战技巧与常见问题解决方案。重点解析了静态磁贴的创建、目标映射配置及权限打通等关键步骤,帮助用户快速掌握FIORI静态磁贴的配置方法。

weixin_29266647的博客 247

iOS开发中利用AFNetworking进行断点下载

在iOS开发中我们如果要下载一个大的文件可能会有断点下载的需求即能够对下载任务进行暂停,之后再开始下载任务,下面即将给出利用AFNetworking进行断点下载的代码。核心思想:将下载的文件的长度记录下载,然后再次下载的时候即发送网络请求的时候在请求头中设置下载数据的位置。关键代码: // 设置HTTP请求头中的Range         NSString *range = [NS

梁森的博客 1287

基于FPGA的PCIe核系列:FPGA root模式生成工程例子分析(1)

一、 PCIE系统架构 1.1 PCIE分层结构 PCIE结构 1.2 TLP包 四种TLP类型。 Memory (内存空间操作) IO (IO空间操作) Configuration (配置操作) Message (信息操作) 四种类型TLP,如果有需要响应,称为Non-Posted TLP,如果没有需要响应,称为Posted TLP。 TLP包类型 1.2.1 TLP结构 TLP数据格式 1.2.2 Header各个字段的含义 Header格式 ...

huangshanhu的博客 3432

iOS开发网络篇—文件下载(四·暂停和恢复)

一、Range简单说明 通过设置请求头Range可以指定每次从网路下载数据包的大小 Range示例 bytes=0-499 从0到499的头500个字节 bytes=500-999 从500到999的第二个500字节 bytes=500- 从500字节以后的所有字节  bytes=-500 最后500个字节 bytes=500-599,800-899 同时

tik11的专栏 448

innovus:Patch Wire(补丁线)

1)选中wire ,shift+A使用Edit Route功能,F3打开edit route对话框。线道Create Patch Wire,设置好层次和宽度。在修补一些min area的drc时,会有一些danling wire的drc冒出来,为了避免这些假错,可以使用工具patch wire功能。2)沿着选中的wire画线即可。如下图,patch wire和regular wire是能看出区别的。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1962

39-OpenLayers多图层切换显示隐藏,支持多个Layer同时显示和隐藏,OpenLayers懒加载瓦片

39-OpenLayers多图层切换显示隐藏,支持多个Layer同时显示和隐藏,OpenLayers懒加载瓦片

fxshy的博客 462

Shimmer动画暂停与恢复:iOS应用状态切换时的无缝过渡

你是否遇到过这样的尴尬场景:用户切换到后台再返回应用时,原本优雅的加载动画突然卡顿或错位?iOS开发中,**Shimmer(微光)动画**作为提升用户体验的常用元素,其状态管理往往被忽视。本文将通过[Shimmer](https://link.gitcode.com/i/753eb7aab1c0db5e47575e505f68973a)框架,手把手教你实现动画在应用生命周期中的无缝过渡,让加载体验...

gitblog_01013的博客 954

为什么 ChatGPT 生成的下载地址会长成 sky-metal-cards-jerry.quirkypony34.chatgpt.site 这种奇怪的样子

我今天看到的这条地址,确实很容易让人产生一种感觉,ChatGPT 明明只是生成了几张 PNG 图片和一个压缩包,为什么最终拿到的却不是类似这种看起来很正规的下载链接,而是一长串带有、UUID、apidecks的地址。更容易让人疑惑的是,其中还出现了一个平时很少见到的域名。这并不是浏览器随机生成的临时 URL,也不是某个来历不明的第三方文件服务器。根据 OpenAI 在 2026 年公布的 ChatGPT Sites 文档和相关服务条款,

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 57

iOS开发网络多线程之断点下载

​一. 断点下载文件1. 实现功能点击"开始下载" -> 开始下载文件,进度条实时变化点击"暂停下载" -> 暂停下载,进度条停止走动点击"恢复下载" -> 接着上一次下载进度下载将正在下载或在暂停没有下载完时,将APP关闭,在重新打开时,进度条现在之前的下载进度,点击开始下载,接着上次下载2. 思路1> 要实现断点下载,需要将已下载文件存放到cache...

193

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

[iOS 多线程 & 网络 - 2.4] - 大文件下载 (边下边写/暂停恢复下载/压缩解压zip/多线程下载)...

A.需求 边下边写入硬盘 显示下载进度 暂停/恢复 下载 解压文件 多线程下载 B.基本知识 1.小文件下载 如果文件比较小,下载方式会比较多直接用NSData的+ (id)dataWithContentsOfURL:(NSURL *)url;利用NSURLConnection发送一个HTTP请求去下载如果是下载图片,还可以利用SDWebImage框架 ...

daxiguan0304的博客 287

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

iOS开发网络篇—多线程断点下载

iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载。项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件。因为实现过程较为复杂,所以下面贴出完整的代码。 实现思路:下载开始,创建一个和要下载的文件大小相同的文件(如果要下载的文件为100M,那么就在沙盒中创建一个100M的文件,然后计算每一段的下载量,开启多条线程下载各段的数据,分别写入对应的文件部分)。 ...

a359798678的博客 83

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

iOS18更新暂停卡住?iOS18升级失败解决办法分享

最近,苹果发布了iOS 18,许多用户都迫不及待更新更新系统体验新功能。然而,一些用户在网上反馈在iOS 18 更新在安装过程中会卡住或暂停,无法正常升级成功。如果遇到“iOS 18更新暂停或卡住”问题,不用担心。在本文中,小编将分析如何恢复暂停或卡住的iOS更新,并介绍几种经过验证的方法,帮助大家解决iOS18卡住无法更新问题,并顺利完成iPhone或iPad上的iOS 18更新。

m0_63254421的博客 1万+

iOS 下载和播放 M3U8

黑客技术点击右侧关注,了解黑客的世界!Java开发进阶点击右侧关注,掌握进阶之路!Linux编程点击右侧关注,免费入门到精通!作者丨Willie_https://juej...

iOS_开发 4730
上一篇: MPMoviePlayerViewController和MPMoviePlayerController的使用
下一篇: iPhone应用程序 将图片保存到相册实例
直隶码农
博客等级 码龄19年 95粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值