iOS7程序后台运行

转载 2015年07月07日 17:51:38

原文链接:http://esoftmobile.com/2013/06/23/ios7%E7%A8%8B%E5%BA%8F%E5%90%8E%E5%8F%B0%E8%BF%90%E8%A1%8C/

介绍

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

在介绍之前, 我们先回顾一下在iOS7之前的后台运行相关的知识。在iOS7之前(iOS4之后)主要有三类的应用程序能够后台运行:

  1. 音频播放
  2. 后台定位服务
  3. IP电话

除了这三种应用,其他程序只能是在进入后台之前向系统请求一个额外的运行时间(最长为10分钟),并在该时间内来进行后台运行操作,如保存用户信息,上传或下载数据,进行视频编码等操作。

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    static UIBackgroundTaskIdentifier task;
    task = [application beginBackgroundTaskWithExpirationHandler:^{
     task = UIBackgroundTaskInvalid;
     };
    //执行后台操作
    [application endBackgroundTask:task];
}

这次iOS7支持了两种新的程序后台运行模式:

  • 需要定期请求数据的程序可以在系统中注册,这样程序就可以在后台被定期唤醒来下载新的数据。这种情况需要在程序的Info.plist文件中UIBackgroundModes项增加fetch类型,同时通过setMinimumBackgroundFetchInterval:方法来设置程序定期获取数据的最小时间间隔。你需要实现application: performFetchWithCompletionHandler: 代理方法并在该方法内执行下载操作。

  • 程序还可以通过后台消息推送服务来通知用户有新的内需可以下载,同时激活后台下载操作。这种需要在UIBackgroundModes项中增加remote-notification值,同时你需要实现AppDelegate方法 application:didReceiveRemoteNotification:fetchCompletionHandler:来执行你的下载操作。

不管是支持fetch或remote-notification后台运行模式的程序,都有可能被系统在合适的时候启动或从后台挂起状态移除调。在fetch模式下,系统会利用有效的信息来决定启动或激活程序的最佳时期。例如:系统可能会在网络状况良好或者设备刚解锁的时候让程序执行fetch操作。支持remote-notifiaction的程序,可以在接收到推送消息的时候被唤醒,但在用户接收到推送消息之前,程序可以通过定期获取的形式下载最新内容,并在随后的推送消息之前就已经准备好将内容展现给用户。

为了执行后台下载操作,程序应该使用新增的NSURLSession类,该类在之前的NSURLConnectoin的基础上提供了更简洁、基于任务的接口来启动并执行NSURLRequest对象。一个NSURLSession对象可以启动多个下载或上传任务,并在代理方法里面来处理来自服务器的认证请求。

实现

现在我们来实现fetch和remote-notifiaction两种后台运行。

1. 设置

在Xcode5.0里面Capabilities下可以直接通过勾选的方式选择应用需要支持的后台运行的类型(可多选哦),我们选中Background fetch和Remote notification两项。并在程序的Info.plist文件中的Required background modes中添加fetch和remote-notification两项。

Multitasking Setting

2. Background Fetch

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    [application setMinimumBackgroundFetchInterval:
     UIApplicationBackgroundFetchIntervalMinimum];
    return YES;
}

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
    NSURL *url = [NSURL URLWithString:@"http://127.0.0.1:3000/update.do"];
    NSURLSession *updateSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
    [updateSession dataTaskWithHTTPGetRequest:url
                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                                NSDictionary *messageInfo = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
                                NSLog(@"messageInfo:%@",messageInfo);
                                completionHandler(UIBackgroundFetchResultNewData);
                            }];
}

首先在application:didFinishLaunchingWithOptions:中设置minimun background fetch interval类型为UIApplicationBackgroundFetchIntervalMinimum(默认为UIApplicationBackgroundFetchIntervalNever),然后实现代理方法application:performFetchWithCompletionHandler:中实现数据请求。

为了测试程序后台运行,我们可以新建一个Scheme,选中Background Fetch(Launch due to a background fetch event),然后在该Scheme下运行程序,程序并不会启动,但是你能看到它给后台发了请求。

New Scheme

Remote Notifications

类似要实现remote-notification模式,需要在原来支持push的条件下实现application:didReceiveRemoteNotification:fetchCompletionHandler:代理方法,程序在后台收到payload中包含“content-available = 1”的推送消息时,会执行该代理方法。(因为模拟器无法模拟消息推送,iPad版本的iOS7还没提供下载,所以我暂时没法亲测)。

总结

总的来说实现上没有什么太复杂的东西,关键是你怎么样将这两种新的后台运行模式应用到你的程序中。

相关文章推荐

iOS7程序后台运行

原文链接:http://esoftmobile.com/2013/06/23/ios7%E7%A8%8B%E5%BA%8F%E5%90%8E%E5%8F%B0%E8%BF%90%E8%A1%8C/ ...

Delphi开发的后台服务程序也可以7x24小时长时间稳定运行

现在用Delphi的人越来越少了,不过没关系,编程的经验应该是可以相通的,并不限于某种语言工具。我最开始也只是用C/C++,但后来我发现Delphi也挺好,在日常的信息系统开发中更具优势,因此就更偏向...
  • huzgd
  • huzgd
  • 2011年02月15日 00:11
  • 7401

IOS开发模块总结(二)后台运行程序(2)Task completion-UIBackgroundTaskIdentifier

(1) Task completion—应用程序可以向系统申请额外的时间去完成给定的任务

iOS程序后台运行继续完成操作

我们知道,到我们程序从前台退到后台(安home)键后,将执行程序的委托方法。 // 当应用程序掉到后台时,执行该方法 - (void)applicationDidEnterBackgrou...

iOS4支持后台运行,程序的事件响应

程序事件: 启动时事件 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDi...
  • sngal3
  • sngal3
  • 2011年10月26日 11:17
  • 2219

IOS程序后台运行及多任务

转自:http://blog.csdn.net/kmyhy/article/details/7170315# 原文:苹果参考库“Network and Multita...

关于ios程序的后台运行

文一  我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时间。  还有三种类型的可以运行在后以,  1.音乐  2.location ...

iOS程序进入后台后仍运行定时器NSTimer

最近再做一个类似于“驾考宝典”的iOS应用,当然作为考试计时的功能肯定不会少,开发期间也是遇到各种各样的小问题,本文所讲为其中之一:iOS程序进入后台后十分钟之内就会被系统kill掉,怎么解决呢?我想...

让iOS程序一直在后台运行

1 众所周知,iOS程序退入后台以后一段时间就会被杀死。那么如何保证一个应用程序进入后台以后一直保持活跃呢??通常最常见的方法就是在后台播放一段音频(没有声音),因为AVPlayer这个类进入后台以后...

iOS后台运行程序(一)——location

对于iOS应用,苹果公司是不允许其在后台(即按下Home键)运行的,如果在后台那么app在5s之内就会被kill掉,不能在运行网络也会断开。 可以通过在applicationDidEnterBackg...
  • Winzlee
  • Winzlee
  • 2016年01月08日 18:42
  • 449
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS7程序后台运行
举报原因:
原因补充:

(最多只允许输入30个字)