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/ ...
  • lengshengren
  • lengshengren
  • 2014年02月11日 14:54
  • 8005

ios7以后如何实现App长时间后台运行

对于ios7,苹果支持几种后台运行模式,backgroundTask,voip,后台播放音乐等,具体看官方文档就好。 我这边需要在后台跑一个长时间运行的计时器,所以就不能让app进入suspen...
  • Ant_Huzi
  • Ant_Huzi
  • 2016年01月14日 22:20
  • 1073

Linux下优雅的让程序后台运行

Linux下优雅的让程序后台运行   假设在终端上启动运行了一个程序,跑了几天,如果不小心把terminal关了,那么程序就会终止,这是SIGHUP信号的原因,即使通过bg置为后台运行同样会如此,应...
  • vonzhoufz
  • vonzhoufz
  • 2015年05月14日 21:47
  • 11806

让程序后台运行的几种方法

我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败。如何让命令提交后不受本地关闭终端窗口/网络断开...
  • lynnucas
  • lynnucas
  • 2016年06月14日 16:16
  • 2928

怎么让程序在windows后台运行

在执行的命令前加上start /b,比如start /b run.bat。就相当于Linux下的run.sh &。 http://blog.csdn.net/gobita...
  • robinson111
  • robinson111
  • 2014年01月28日 22:24
  • 1687

Linux中如何将程序放置后台运行

经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败。如何让命令提交后不受本地关闭终端窗口/网络断开连接...
  • nuoline
  • nuoline
  • 2013年02月25日 18:39
  • 2025

C#如何让控制台应用程序后台运行3个方法

将写好的控制台应用程序,在VS项目中,项目——某某项目属性——输出类型:windows应用程序即可...
  • wk2133
  • wk2133
  • 2016年12月26日 15:47
  • 2930

ubuntu 程序后台运行几个方法

1. 程序后加上“&” ,即 “./myjob &”, 将命令放入到一个作业队列中,可以用命令“jobs” 查看 2. 将1中的命令放在 “()”中, 即 “(./myjob &)”,所提交的作业并...
  • wishfly
  • wishfly
  • 2015年04月27日 15:02
  • 5079

c# 程序后台运行

请把notifyIcon与button拖至窗口里后,在使用下面的代码 private bool windowsCreate = true; private void but...
  • kjlrzzyffmx
  • kjlrzzyffmx
  • 2015年10月11日 23:50
  • 1758

nohup大法让程序在服务器后台运行

linux下通常部署完程序,需要让它一直在后台运行,否则ssh一旦断开,整个进程就挂了。今天要介绍的就是一个关于让程序在后台运行的命令nohup!!!网上的许多文章对于nohup这个命令有非常细致的讲...
  • u012745215
  • u012745215
  • 2016年11月27日 16:44
  • 2605
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS7程序后台运行
举报原因:
原因补充:

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