[转]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/]

iOS7程序后台运行

2013-06-23

介绍

这次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两项。

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下运行程序,程序并不会启动,但是你能看到它给后台发了请求。

Remote Notifications

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

总结

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

时间: 2024-10-25 07:17:31

[转]iOS7 后台执行的相关文章

如何让程序在后台执行

示例:查看系统负载的脚本 #!/bin/sh while true do uptime >/tmp/uptime.log sleep 1 done [[email protected] scripts]# tail -f /tmp/uptime.log 21:37:26 up 5:49, 2 users, load average: 0.00, 0.00, 0.00 tail: /tmp/uptime.log: file truncated 21:37:27 up 5:49, 2 users,

forever让nodejs应用后台执行

nodejs一般是当成一条用户命令执行的,当用户断开客户连接,运用也就停了,很烦人.如何让nodejs应用当成服务,在后台执行呢? 最简单的办法: $ nohup node app.js & 但是,forever能做更多的事情,比如分别记录输出和错误日志,比如可以在js中作为api使用. $ sudo npm install forever -g #安装 $ forever start app.js #启动 $ forever stop app.js #关闭 $ forever start -l

后台执行进程的方法

后台进程: 我们每次在终端窗口执行命令的时候,进程总会一直占用着终端,走到进程结束,这段时间内,我们在终端的输入是没有用的.而且,当终端窗口关闭或网络连接失败后,再次打开终端,会发现进程已经中断了.这是因为用户注销或者网络断开时,SIGHUP信号会被发送到会话所属的子进程,而此 SIGHUP 的默认处理方式是终止收到该信号的进程.所以若程序中没有捕捉该信号,当终端关闭后,会话所属进程就会退出. 我们要实现后台执行的目的,实际上是要完成如下两个目标: 使进程让出前台终端,让我们可以继续通过终端与系

后台执行脚本管理

防止脚本执行中断的方法: a.sh while.sh & b.screen 总结此命令 c.nohup /server/script/02/while.sh & crtl + c   停止任务 ctrl + z   暂停任务 bg     把任务放到后台执行 fg 把后台的第一个任务放到前台执行,如果有多个任务,可以用fg 加任务编号调出 jobs   查看当前执行的脚本或者任务 top 显示进程 nice 改变系统优先级 nohup 用户退出系统之后可以继续工作 pgrep 查看匹配条件

所经历的大文件数据导出(后台执行,自动生成)

所经历的大文件数据导出(后台执行,自动生成) http://www.cnblogs.com/fanfan259/p/4710019.html 阅读目录 一.前言 二.生成excel文件 三.让程序在后台执行 四.显示文件生成进度 五.下载文件 六.上线后出现的问题 七.相应的后续优化 八.后记 一.前言 记录一下以前做的后台excel格式导出统计信息的功能,也是最近同事问到了相关东西,一时之间竟忘了具体的细节,因此记录一下: 大家知道,excel导出数据的功能,后台几乎是必须功能,一般都是点击后

后台执行shell脚本

执行方式: nohup sh export_data.sh 20150102 >20150102.log 2>&1 & [1] 29531 其中 0.1.2分别代表如下含义: 0 – stdin (standard input) 1 – stdout (standard output) 2 – stderr (standard error) nohup+最后面的& 是让命令在后台执行 >out.log 是将信息输出到out.log日志中 2>&1 是

如何后台执行脚本程序?

文章来自:http://www.cnblogs.com/hark0623/p/4196381.html    转载请注明 需要在你的脚本前面添加nohub,后边添加&.例如下面的脚本: nohup ./flume_client.sh & nohup的作用:当你的SecureCRT会话关闭后,保证你的脚本还在Linux后台执行 &的作业:在你的会话中后台执行脚本. 如果不添加&的话,那么你关闭SecureCRT(这时也就是关闭了会话)后,你的脚本一定也会断掉的

linux 如何让程序后台执行

$ (./test.sh &) $ setsid ./test.sh & $ nohup ./test.sh & 具体的转自:http://digdeeply.org/archives/06281192.html 在Linux中,如果要让进程在后台运行,一般情况下,我们在命令后面加上&即可,实际上,这样是将命令放入到一个作业队列中了: Example 1 2 3 4 5 $ ./test.sh & [1] 17208 $ jobs -l [1]+ 17208 Run

Linux命令后台执行技巧小结

1.最简单的方法: command & 例如: top & 此时显示job编号和后台进程号 [1] 14814 2.正在运行的程序放入后台 Ctrl - Z 3.查看有哪些后台进程及状态 jobs 4.将后台进程切换到前台执行 fg job编号 5.让后台暂停的进程继续执行 bg job编号 6.杀死后台执行程序 kill %job编号 7.让程序在后台执行,关闭终端也不退出 例如一个不断输出程序test.sh,如下 while [ True ] do echo hello sleep 1