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

参考: iOS7中的多任务

iOS Backgrounding Techniques

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

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

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

iOS7 新后台及下载SDK介绍的更多相关文章

  1. IOS7 新特性(针对同样讨厌更新后IOS7的开发者)

    本文转载至 http://blog.csdn.net/hanbing861210/article/details/13614211 您还未登录!|登录|注册|帮助 首页 业界 移动 云计算 研发 论坛 ...

  2. iOS7程序后台运行

    介绍 这次 iOS7 对程序后台运行进行了加强,但是仅仅是加强而已,要想像 Android 程序那样自由当然就别想了,苹果这么做主要还是出于电池使用时间考虑,但是这次的加强对大部分程序基本够用. 在介 ...

  3. Android SDK Manager 下载SDK失败的解决办法

    摘要:本文记录了无法使用Android SDK  Manager下载SDK开发包的解决办法. 最近需要进行android应用程序的开发工作,在android官网下载了adt-bundle-linux- ...

  4. ar技术序章-SDK介绍和选择

    转自: http://blog.csdn.net/kun1234567/article/details/10402535 ar技术序章-SDK介绍和选择 分类: Augmented Reality20 ...

  5. iOS7新特性-NSURLSession详解

    前言:本文由DevDiv版主@jas 原创翻译,转载请注明出处!原文:http://www.shinobicontrols.com/b ... day-1-nsurlsession/ 大家都知道,过去 ...

  6. ios7新特性1-UI变化、UIKit动态行为支持与Text Kit新接口

    iOS 7.0新特性1 iOS 7的UI经过了重新设计.另外,iOS7中引入了新的动画系统,便于创建2D和2.5D的游戏.多任务支持提升,点对点通讯以及其他重要的特征使iOS7相对于以往的SDK来说发 ...

  7. ios7新特性2--多任务提升

    iOS 7 为应用程序提供新的后台执行模式: 应用程序需要需要下载新内容,可以向系统注册,这样程序会被定期唤起或者启动,然后可以在后台下载内容.要注册这个功能,需要打开Info.plist 文件,设置 ...

  8. 李洪强iOS开发之-环信02_iOS SDK 介绍及导入

    李洪强iOS开发之-环信02_iOS SDK 介绍及导入 iOS SDK 介绍及导入 iOS SDK 介绍 环信 SDK 为用户开发 IM 相关的应用提供的一套完善的开发框架.包括以下几个部分: SD ...

  9. 后台文本编辑器KindEditor介绍

    后台文本编辑器KindEditor介绍 我们在自己的个人主页添加文章内容的时候,需要对文章内容进行修饰,此时就需要文本编辑器助阵了! 功能预览 KindEditor文本编辑器 KindEditor文本 ...

随机推荐

  1. ES6 Syntax and Feature Overview

    View on GitHub Note: A commonly accepted practice is to use const except in cases of loops and reass ...

  2. SortedMap和TreeMap有什么区别?

    SortedMap和TreeMap有什么区别   答: TreeMap的类的源码: public class TreeMap<K,V> extends AbstractMap<K,V ...

  3. html页面设置自动刷新

    在中添加如下: <meta HTTP-EQUIV="REFRESH" CONTENT="1"> 其中CONTENT对应刷新的间隔时间,这里为1秒. ...

  4. 【Leetcode_easy】821. Shortest Distance to a Character

    problem 821. Shortest Distance to a Character solution1: class Solution { public: vector<int> ...

  5. 【leetcode_easy】590. N-ary Tree Postorder Traversal

    problem 590. N-ary Tree Postorder Traversal 参考 1. Leetcode_easy_590. N-ary Tree Postorder Traversal; ...

  6. 常见问题:计算机网络/运输层/TCP

    TCP 面向连接,全双工,点对点. TCP头格式 TCP包没有IP地址,IP地址在网络层的IP协议中,TCP包包括源端口号,目标端口号 一个TCP连接需要四个元祖表明是同一连接(src_ip,src_ ...

  7. Spring 商品分类

    实体商品示例代码 package cn.maxhou.entity; import java.io.Serializable; import java.math.BigDecimal; import ...

  8. oracle 查看表空间以及日志文件等系统文件

    --1.查看表空间的名称及大小 )), ) ts_size FROM dba_tablespaces t, dba_data_files d WHERE t.tablespace_name = d.t ...

  9. 有四个数字能组成多少个互不相同的三位数 --Python

    有四个数字能组成多少个互不相同的三位数? num = 0 for i in range(1, 5): for j in range(1, 5): for k in range(1, 5): if i ...

  10. Django与JS交互的示例代码-django js 获取 python 字典-Django 前后台的数据传递

    Django与JS交互的示例代码 Django 前后台的数据传递 https://www.cnblogs.com/xibuhaohao/p/10192052.html 应用一:有时候我们想把一个 li ...