iOS7 新后台及下载SDK介绍

   在iOS7之前的系统中,App默认是不能后台运行的,若是要后台运行,能够采用如下两类方法:ios

  (1)使用beginBackgroundTaskWithExpirationHandler函数,向系统申请一段时间来执行须要后台运行的操做,这种方法的缺点是,后台操做最多只能运行10分钟,超过10分钟以后App会休眠。使用这种方法须要APPNAME-info.plist中设置Application does not run in background为NO,而后在适当的时间调用beginBackgroundTaskWithExpirationHandler函数。网络

 (2)将App的后台运行模式设置为audio 、VOIP、location、Newstand等。使用这种方法,能够无限制的在后台运行,以audio为例,将plist中的Required background modes项目设置为App plays audio or streams audio/video using AirPlay,而且在进入后台时播放无声音乐,就可让App一直运行。这种方法的缺点是,若是使用不当,可能会被AppStore拒绝。由于审核时是能够经过静态分析知道使用了哪些API的,若是一个程序原本就不是音乐类的,却使用了播放音乐的API后台播音乐,有可能就被拒绝,若是想要绕过这个限制,能够向APP增长播放音乐的功能,但这样实际是增长了无用功能。session

    在iOS7之后,系统增长了两种后台的模式,一种是Background fetch ,另外一种是Remote notification,下面分别介绍。app

    Background fetch:  设置了这种后台方式以后,当App休眠以后,会隔一段时间被系统唤醒,从而执行一段短期操做。唤醒的间隔由系统决定,App中能够设置[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];,但即便设置了,间隔也不肯定是多少。另外,App被唤醒后,能够执行操做的时间也不长,文档上描述的30秒左右(实际上更长也能够,可是可能会下降之后被唤醒的概率)。ide

  Remote notification:在iOS7之前,当系统收到推送消息后,会当即弹出消息提示用户,用户点击消息以后,就能够启动App,而后加载数据。使用了这种新的后台模式以后,当系统收到推送消息以后,会唤醒App,给App一个机会执行一部分操做,等操做以后才提醒用户,并且还支持silent模式,即执行完操做以后,彻底不对用户作任何提醒,默默的就在后台把活干完了。函数

   除了增长了上述的两种新后台模式之外,ios7还增长了一下传输数据的方法,即Background Transfer service 。fetch

(1)Background Transfer service概述ui

      这种方法的名字很容易让人误解,觉得是App进入后台时,使用这种方法进行数据传输。实际上,这种方法与后台无关。 当App使用了这种方法后,能够将一个下载任务交给系统的独立进程去下载,无论App在前台、休眠、以及crash,下载过程都在进行,由于是系统的独立进程在为App进行下载。当系统的下载任务结束或者出错时,系统会唤醒App,调用其中的函数,让App作一部分处理,好比让App从新添加其余任务。这里有一个缺点就是,若是由于没有网络致使系统下载失败了,系统即便唤醒了App,App也是没有办法下载的,而后App会进入休眠,即便后面有了网络,系统也不会继续下载,由于只要系统向App发出了失败的信号,除非App 调用resume函数来恢复下载过程,系统是不会本身恢复下载的。这里就须要用到前面提到的fetch后台模式,让App过一段时间被系统唤醒,而后App就能够去检查网络,当有网时恢复下载过程。url

(2)相关类介绍spa

  NSURLSession  session类

  NSURLSessionConfiguration 用于初始化session的配置类

  NSURLSessionTask—The base class for tasks within a session.  全部task的基类

  NSURLSessionDataTask 用来读取url的返回内容的task类(不支持background session)

  NSURLSessionUploadTask用于上传文件的task类

  NSURLSessionDownloadTask 用于将url下载成为临时文件的task类

  NSURLSessionDelegate  处理session级别的事件

  NSURLSessionTaskDelegate处理全部task级别的通用事件

  NSURLSessionDataDelegate 处理与读取Data有关的事件

  NSURLSessionDownloadDelegate    处理与下载文件有关的事件

 

(3)使用步骤(如下载文件为例)

  1. 建立URLSession

- (NSURLSession *)backgroundSession

{

    //Use dispatch_once_t to create only one background session. If you want more than one session, do with different identifier

    static NSURLSession *session = nil;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:session_id];

        configuration.discretionary = YES;

        session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];

    });

    [configDict setObject:session_id forKey:@"session_id"];

    return session;

}

 

  2.建立DownloadTask

         NSURL *downloadURL = [NSURL URLWithString:@"http:// 17-45990.dmg"];

        NSURLRequest *request = [NSURLRequest requestWithURL:downloadURL];

        self.session = [self backgroundSession];

 

        self.downloadTask = [self.session downloadTaskWithRequest:request];

 

         [self.downloadTask resume];

   当建立完task,而且resume以后,任务就开始下载了

 

  3.实现下载的回调,接收事件

(1) 在须要响应回调的类里面实现NSURLSessionDelegate、NSURLSessionTaskDelegate、NSURLSessionDownloadDelegate等协议

(2)实现如下函数:

   URLSession:downloadTask: didWriteData   得到当前下载的数据大小及总大小

   URLSession: downloadTask: didFinishDownloadingToURL   成功下载以后调用,能够得到临时文件的本地地址

   URLSession: task: didCompleteWithError  文件下载失败的回调

   URLSessionDidFinishEventsForBackgroundURLSession:  一个session结束以后,会在后台调用

   application: performFetchWithCompletionHandler: 当App被fetch唤醒时调用

   application: handleEventsForBackgroundURLSession:completionHandler: 在这个函数中检查是否传输已经完成,而后调用completionHandle来更新AppSwitcher界面

  4. 关于断点续传

   (1)因为下载过程是由系统在处理,即便App被杀死也不影响下载,所以App无需在断网或者退出时记录当前的下载位置。

   (2)当下载过程开启后,只要系统没有发出失败信号,即便断网了、系统关机了,等恢复网络或者系统重启以后,系统会继续下载,此时app只须要建立与上次相同id的session,便可接收到下载进度信息。若是app收到了失败信号,须要从nserro中经过userinfo来获取resumedata,从而在下次恢复下载时,使用downloadTaskWithResumeData函数来建立task,这样就能够断点续传,而不是用downloadTaskWithRequest来建立task,后者会开启一个新的下载。

 

参考: iOS7中的多任务

         iOS Backgrounding Techniques

 

==========================华丽的分割线==============================

 日剧高手是一个根据剧照猜剧名的App,App向用户提供日剧的剧照,由用户来选择答
案。
   系统里面如今包含三百部日剧的剧照,若是你想知道本身的日剧水平怎么样,就来挑战
下吧 O(∩_∩)O~

   下载地址:
   https://itunes.apple.com/cn/app/ri-ju-gao-shou/id889031444?mt=8 
--

相关文章
相关标签/搜索