总结iOS开发中的断点续传与实践

2020-01-15 16:41:33丽君

实现效果如图 6 所示:

图 6. NSURLConnection 演示

ios开发断点续传,ios断点续传,ios断点续传原理

NSURLSessionDataTask

苹果在 iOS7 开始,推出了一个新的类 NSURLSession, 它具备了 NSURLConnection 所具备的方法,并且更强大。由于通过 NSURLConnection 从 2015 年开始被弃用了,所以读者推荐基于 NSURLSession 去实现续传。NSURLConnection 和 NSURLSession delegate 方法的映射关系 , 如图 7 所示。所以关键是要满足 NSURLSessionDataDelegate 和 NSURLsessionTaskDelegate。

图 7. 协议之间映射关系

ios开发断点续传,ios断点续传,ios断点续传原理

代码如清单 3 所示 , 基本和 NSURLConnection 实现的一样。

清单 3. NSURLSessionDataTask 的实现


 // SWIFT 
 // 接收数据
 func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, 
 idReceiveData data: NSData) { 
  //. . . 
 } 
 // 接收服务器响应
 func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, 
 didReceiveResponse response: NSURLResponse, completionHandler: 
 (NSURLSessionResponseDisposition) -> Void) { 
  // . . . 
  completionHandler(.Allow) 
 } 

 // 请求完成
 func URLSession(session: NSURLSession, task: NSURLSessionTask, 
 didCompleteWithError error: NSError?) { 
  if error == nil { 
    // . . . 
    self.successHandler(responseObject:self.fileName!) 
  } else { 
    self.failureHandler(error:error!) 
  } 
 }

区别在与 didComleteWithError, 它将 NSURLConnection 中的 connection:didFailWithError:

和 connectionDidFinishLoading: 整合到了一起 , 所以这边要根据 error 区分执行成功的 Block 和失败的 Block。

实现效果如图 8 所示:

图 8. NSURLSessionDataTask 演示

ios开发断点续传,ios断点续传,ios断点续传原理

NSURLSessionDownTask

最后来看下 NSURLSession 中用来下载的类 NSURLSessionDownloadTask,对应的协议是 NSURLSessionDownloadDelegate,如图 9 所示:

图 9. NSURLSessionDownloadDelegate 协议

ios开发断点续传,ios断点续传,ios断点续传原理

其中在退出 didFinishDownloadingToURL 后,会自动删除 temp 目录下对应的文件。所以有关文件操作必须要在这个方法里面处理。之前笔者曾想找到这个 tmp 文件 , 基于这个文件做断点续传 , 无奈一直找不到这个文件的路径。等以后 SWIFT 公布 NSURLSession 的源码之后,兴许会有方法找到。基于 NSURLSessionDownloadTask 来实现的话 , 需要在 cancelByProducingResumeData 中保存已经下载的数据。进度通知就非常简单了,直接在