iOS7 新后台及下载SDK介绍

简介: 转载自:http://www.cnblogs.com/gugupluto/p/3359372.html    在iOS7以前的系统中,App默认是不能后台运行的,如果要后台运行,可以采用以下两类方法:   (1)使用beginBackgroundTaskWithExpirationHandler函数,向系统申请一段时间来执行需要后台运行的操作,这种方法的缺点是,后台操作最多只能运行10分钟,超过10分钟之后App会休眠。

转载自:http://www.cnblogs.com/gugupluto/p/3359372.html

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

  (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增加播放音乐的功能,但这样实际是增加了无用功能。

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

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

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

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

(1)Background Transfer service概述

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

(2)相关类介绍

  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,后者会开启一个新的下载。

目录
相关文章
|
7月前
|
开发工具 iOS开发
iOS 支付宝SDK比较隐秘的坑
iOS 支付宝SDK比较隐秘的坑
114 0
|
8月前
|
开发工具 对象存储 Python
使用Python的SDK从OSS中下载指定日期的所有文件
使用Python的SDK从OSS中下载指定日期的所有文件
210 1
|
10天前
|
存储 移动开发 前端开发
对象存储oss使用问题之OSS SDK .net 使用下载例程报错如何解决
《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。
25 0
|
8月前
|
API 开发工具 iOS开发
一点就通,社交源码IOS客户端开发集成SDK
所谓SDK,全称是SoftwaredevelopmentKit,翻译成软件开发工具包。SDK用助开发某种软件,今天给大家简单讲解下如何在社交源码IOS客户端上开发集成 SDK。
|
8月前
|
API 开发工具 iOS开发
一点就通,社交源码IOS客户端开发集成SDK
所谓SDK,全称是SoftwaredevelopmentKit,翻译成软件开发工具包。SDK用助开发某种软件,今天给大家简单讲解下如何在社交源码IOS客户端上开发集成 SDK。
|
9月前
|
存储 缓存 iOS开发
iOS 轻量化动态图像下载缓存框架实现
日常开发过程中,图片的下载会占用大量的带宽,图片的加载会消耗大量的性能和内存,正确的使用图片显得尤为重要。 同样也经常需要在各类型控件上读取网络图片和处理本地图片,例如:UIImageView、UIBtton、NSImageView、NSButton等等。
iOS 轻量化动态图像下载缓存框架实现
|
10月前
|
前端开发 算法 Java
使用虹软SDK实现离线人脸注册,人脸登录(H5-JS前端,java后台)
一开始找人脸识别的第三方接口,选择了百度,就是发请求给百度的接口,解析人家返回的数据。
|
11月前
|
iOS开发
iOS下载文件保存到手机文件指定目录
iOS下载文件保存到手机文件指定目录
734 0
|
安全 数据安全/隐私保护 iOS开发
iMazing官网下载安装教程 2023最新版兼容Win和Mac的iOS设备管理软件
iMazing是一款功能强大的iOS设备管理软件,它可以帮助用户备份和管理他们的iPhone、iPad或iPod Touch上的数据。除此之外,它还可以将备份数据转移到新的设备中、管理应用程序、导入和导出媒体文件等。本文将详细介绍iMazing的功能和安全性,并教大家如何使用iMazing来恢复备份数据。
395 0
|
iOS开发 芯片 MacOS
macOS Big Sur 正式发布并已开放下载,支持原生运行 iOS 和 iPadOS App
macOS Big Sur 正式发布并已开放下载,支持原生运行 iOS 和 iPadOS App
150 0