设为首页 加入收藏

TOP

总结iOS开发中的断点续传那些事儿(一)
2017-10-12 17:45:14 】 浏览:6474
Tags:总结 iOS 开发 断点 那些 事儿

前言

断点续传概述

断点续传就是从文件赏赐中断的地方重新开始下载或者上传数据,而不是从头文件开始。当下载大文件的时候,如果没有实现断点续传功能,那么每次出现异常或者用户主动的暂停,都会从头下载,这样很浪费时间有木有。所以呢,项目中实现大文件下载的时候,断点续传功能是必不可少了。当然咯,断点续传有一种特殊的情况,就是我们的应用呗用户kill掉或者应用crash,要实现应用重启之后的断点续传,这种情况就是我们将要解决的问题。

断点续传的原理

要实现断点续传,服务器必须是要支持的。目前最常见的两种方式:FTPHTTP

下面来简单介绍HTTP断点续传的原理。

HTTP

通过HTTP,可以非常方便的实现断点续传。断点续传主要依赖于HTTP头部定义的Range,应用可以通过HTTP请求曾经获取失败的资源的某一个返回或者部分来恢复下载该资源。当然并不是所有风服务器都支持Range,所以不支持Range的不在我们考虑之内。Range是以字节计算的,请求的时候不比给我结尾字节数,因为请求方并不一定知道资源的大小。
通过这个关键字可以告诉服务器返回哪些数据给我。
比如:
bytes=500-999 表示第500-第999字节
bytes=500- 表示从第500字节往后的所有字节
然后我们再根据服务器返回的数据,将得到的data数据拼接到文件后面,就可以实现断点续传了。

断点续传分析—AFHTTPRequestOperation

在了解了断点续传的原理之后,我们就可以动手来实现iOS中的断点续传了。由于我现在接触到的项目都是部署在HTTP服务器上的,所以断点续传功能也基于HTTP实现。首先我们来最简单的入手,第三方神奇AFNetworking中提供的实现,下面请看详细代码:

 //1.指定下载文件的地址URLString
 //2.获取保存的文件路径filePath
 //3.获得NSURLRquest
    NSString* URLString = @"";
    NSString* filePath = @"";

    NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:URLString]];
    signed long long downloadBytes = 0;
    ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
        // 3.1 若之前下载过 , 则在 HTTP 请求头部加入 Range
        // 获取已下载文件的 size
        downloadedBytes = [self fileSizeForPath:filePath];

        // 验证是否下载过文件
        if (downloadedBytes > 0) {
            // 若下载过 , 断点续传的时候修改 HTTP 头部部分的 Range
            NSMutableURLRequest *mutableURLRequest = [request mutableCopy];
            NSString *requestRange =
            [NSString stringWithFormat:@"bytes=%llu-", downloadedBytes];
            [mutableURLRequest setValue:requestRange forHTTPHeaderField:@"Range"];
            request = mutableURLRequest;
        }
    }

    // 4 创建 AFHTTPRequestOperation
    AFHTTPRequestOperation *operation
    = [[AFHTTPRequestOperation alloc] initWithRequest:request];

    // 5 设置操作输出流 , 保存在第 2 步的文件中
    operation.outputStream = [NSOutputStream
                              outputStreamToFileAtPath:filePath append:YES];

    // 6 设置下载进度处理 block
    [operation setDownloadProgressBlock:^(NSUInteger bytesRead,
                                          long long totalBytesRead, long long totalBytesExpectedToRead) {
        // bytesRead 当前读取的字节数
        // totalBytesRead 读取的总字节数 , 包含断点续传之前的
        // totalBytesExpectedToRead 文件总大小
    }]; 

    // 7 设置 success 和 failure 处理 block 
    [operation setCompletionBlockWithSuccess:^(
                                           &nbs
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇AFNetworking报错"_UTTypeCo.. 下一篇iOS开源项目周报1222

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目