iOS7中的多任务II

推送唤醒(Remote
Notifications)

  在iOS6和之前,推送的类型是很单一的,无非就是显示标题内容,指定声音等。用户通过解锁进入你的应用后,appDelegate中通过推送打开应用的回调将被调用,然后你再获取数据,进行显示。这和没有后台获取时的打开应用后再获取数据刷新的问题是一样的。

  在iOS7中这个行为发生了一些改变,我们有机会使设备在接收到远端推送后让系统唤醒设备和我们的后台应用,并先执行一段代码来准备数据和UI,然后再提示用户有推送。这时用户如果解锁设备进入应用后将不会再有任何加载过程,新的内容将直接得到呈现。

  1、启用推送唤醒。

    更改Info.plist,在UIBackgroundModes下加入remote-notification即可开启,当然同样的更简单直接的办法是使用Capabilities。

  2、更改推送的payload。

    在iOS7中,如果想要使用推送来唤醒应用运行代码的话,需要在payload中加入content-available,并设置为1。 

1 aps {
2 content-available: 1
3 alert: {...}
4 }

  3、实现推送唤醒代码并通知系统。

    在appDelegate中实现?-application:didReceiveRemoteNotification:fetchCompletionHandle:。这部分内容后台获取部分完全一样。

  Apple将限制此类推送的频率,当频率超过一定限制后,带有content-available标志的推送将会被阻塞,以保证用户设备不被频繁唤醒。按照Apple的说法,这个频率在一小时内个位数次的推送的话不会有太大问题。

后台传输(?Background
Transfer Service)

  iOS7引入了后台传输的相关方式,用来保证应用退出后数据下载或者上传能继续进行。这种传输是由iOS系统进行管理的,没有时间限制,也不要求应用运行在前台。

  想要实现后台传输,就必须使用iOS7的新的网络连接的类,NSURLSession。这是iOS7中引入用以替代陈旧的NSURLConnection的类。

  1、创建NSURLSession。


 1 - (NSURLSession *)backgroundSession
2 {
3 //Use dispatch_once_t to create only one background session. If you want more than one session, do with different identifier
4 static NSURLSession *session = nil;
5 static dispatch_once_t onceToken;
6 dispatch_once(&onceToken, ^{
7 NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.yourcompany.appId.BackgroundSession"];
8 session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
9 });
10 return session;
11 }

  2、加入对应的传输用的NSURLSessionTask,并启动下载。


 1 //@property (nonatomic) NSURLSession *session;
2 //@property (nonatomic) NSURLSessionDownloadTask *downloadTask;
3
4 - (NSURLSession *)backgroundSession
5 {
6 //...
7 }
8
9 - (void) beginDownload
10 {
11 NSURL *downloadURL = [NSURL URLWithString:DownloadURLString];
12 NSURLRequest *request = [NSURLRequest requestWithURL:downloadURL];
13 self.session = [self backgroundSession];
14 self.downloadTask = [self.session downloadTaskWithRequest:request];
15 [self.downloadTask resume];
16 }

  3、最后一步是在appDelegate中实现-application:handleEventsForBackgroundURLSession:completionHandler:


 1 //AppDelegate.m
2 - (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier
3 completionHandler:(void (^)())completionHandler
4 {
5 //Check if all transfers are done, and update UI
6 //Then tell system background transfer over, so it can take new snapshot to show in App Switcher
7 completionHandler();
8
9 //You can also pop up a local notification to remind the user
10 //...
11 }

  一旦后台传输的状态发生变化(包括正常结束和失败)的时候,应用将被唤醒并运行appDelegate中的回调接下来NSURLSessionTask的委托方法将在后台被调用。虽然上面的例子中直接在appDelegate中call了completionHandler,但是实际上更好的选择是在appDelegate中暂时持有completionHandler,然后在NSURLSessionTask的delegate方法中检查是否确实完成了传输并更新UI后,再调用completionHandler。另外,你的应用到现在为止只是在后台运行,想要提醒用户传输完成的话,也许你还需要在这个时候发送一个本地推送(记住在这个时候你的应用是可以执行代码的,虽然是在后台),这样用户可以注意到你的应用的变化并回到应用,并开始已经准备好数据和界面。

  后台传输只会通过wifi来进行。

参考:http://onevcat.com/2013/08/ios7-background-multitask/

时间: 2024-08-10 15:39:37

iOS7中的多任务II的相关文章

iOS7中的多任务 - Background Fetch,Silent Remote Notifications,?Background Transfer Service

转自:http://onevcat.com/2013/08/ios7-background-multitask/ 在IOS 7 出来不就,公司内部也组织了一次关于IOS 7 特性的的分享,今天看见onevcat 的blog,感叹它很有耐性和细心,写的这么详细,那就毫无保留原封不动的(其实也没有什么好改写的,实在是perfect )的分享给大家,希望对大家有所帮助. WWDC 2013 Session笔记 - iOS7中的多任务 iOS7的后台多任务特性 这是我的WWDC2013系列笔记中的一篇,

iOS7中的多任务I

[改变了后台任务的运行方式] 在iOS6和之前的系统中,系统在用户退出应用后,如果应用正在执行后台任务的话,系统会保持活跃状态直到后台任务完成或者是超时以后,才会进入真正的低功耗休眠状态. 而在iOS7中,后台任务的处理方式发生了改变.系统将在用户锁屏后尽快让设备进入休眠状态,以节省电力,这时后台任务是被暂停的.之后在设备在特定时间进行系统应用的操作被唤醒(比如检查邮件或者接到来电等)时,之前暂停的后台任务将一起进行.就是说,系统不会专门为第三方的应用保持设备处于活动状态.如下图示: 这个变化在

iOS7中计算UILabel中字符串的高度

iOS7中出现了新的方法计算UILabel中根据给定的Font以及str计算UILabel的frameSize的方法.本人提供category如下: UILabel+StringFrame.h ////  UILabel+StringFrame.h//  LabelHeight////  Copyright (c) 2014年 Y.X. All rights reserved.//#import <UIKit/UIKit.h>@interface UILabel (StringFrame)- 

iOS7中UIView的animateKeyframesWithDuration方法讲解

在iOS7中,给UIView添加了一个方法用来直接使用关键帧动画而不用借助CoreAnimation来实现,那就是animateKeyframesWithDuration 以下是使用源码: // // ViewController.m // // Created by YouXianMing on 14/11/26. // Copyright (c) 2014年 YouXianMing. All rights reserved. // #import "ViewController.h"

lintcode:寻找旋转排序数组中的最小值 II

寻找旋转排序数组中的最小值 II 假设一个旋转排序的数组其起始位置是未知的(比如0 1 2 4 5 6 7 可能变成是4 5 6 7 0 1 2). 你需要找到其中最小的元素. 数组中可能存在重复的元素. 解题 暴力直接线性查找 或者,线性找到第一个开始降序的位置对应的数 应该考虑二分法 递归 + 二分 public class Solution { /** * @param num: a rotated sorted array * @return: the minimum number in

iOS7中Cell高度 Label高度自适应

? 1 2 3 4 5 6 7 8 9 10 11 12 ?- (float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{     NSString *str = [_dataArray objectAtIndex:indexPath.row];     UIFont *tfont = [UIFont systemFontOfSize:14.0];     NSDictio

ios7中 丰富多彩的UIViewController之间的切换

转载自:http://onevcat.com/2013/10/vc-transition-in-ios7/ 毫无疑问,ViewController(在本文中简写为VC)是使用MVC构建Cocoa或者CocoaTouch程序时最重要的一个类,我们的日常工作中一般来说最花费时间和精力的也是在为VC部分编写代码.苹果产品是注重用户体验的,而对细节进行琢磨也是苹果对于开发者一直以来的要求和希望.在用户体验中,VC之间的关系,比如不同VC之间迁移和转换动画效果一直是一个值得不断推敲的重点.在iOS7中,苹

ios7中使用scrollview来横向滑动图片,自动产生偏移竖向的偏移 问题

ios7中使用scrollview来横向滑动图片,自动产生偏移竖向的偏移 问题 如图红色为scrollview的背景色,在scrollview上加了图片之后,总会有向下的偏移 设置contentOffset也不管用 在ios7中controller有个 automaticallyAdjustsScrollViewInsets属性,默认为YES if (iOS7&&[self respondsToSelector:@selector(automaticallyAdjustsScrollVie

GTK+中的构件II(Widgets)

GTK+中的构件II(Widgets) 在本章的GTK+程序设计中,我们仍然要继续向大家介绍和展示各种各样的构件. GtkComboBox GtkComboBox构件的作用是让程序使用者根据不同的需求从很多选项中进行选择. #include <gtk/gtk.h> void combo_selected(GtkWidget *widget, gpointer window) { gchar *text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(