IOS7对程序后台运行进行了加强,在IOS7之前及IOS4之后主要有三类的应用程序能够后台运行:
1、音频播放
2、后台定位服务
3、IP电话
除了这三种应用,其他程序只能是在进入后台之前向系统请求一个额外的运行时间(最长为10分钟),并在该时间内来进行后台运行操作,如保存用户信息,上传或者下载数据,进行视频编码等操作。
- (void)applicationDidEnterBackground:(UIApplication *)application { static UIBackgroundTaskIdentifier task; task = [application beginBackgroundTaskWithExpirationHandler:^{ task = UIBackgroundTaskInvalid; }; // 执行后台操作 [application endBackgroundTask:task]; }IOS7支持了两种新的程序后台运行模式:
1、需要定期请求数据的程序可以在系统中注册,这样程序就可以在后台被定期唤醒来下载新的数据。
这种情况需要在程序的Info.plist文件中UIBackgroundModes项增加fetch类型,同时通过setMinimumBackgroundFetchInterval:方法来设置程序定期获取数据的最小时间间隔。
需要实现application:performFetchWithCompletionHandler:代理方法并在该方法内执行下载操作
2、程序可以通过后台消息推送服务来通知用户有新的需要可以下载,同时激活后台下载操作。这种需要在UIBackgroundModes项中增加remote-notification值,同时需要实现 appDelegate方法application:didReceiveRemoteNotification:fetchCompletionHandler:来执行你的下载操作。
不管是支持fetch或remote-notification后台运行模式的程序,都有可能被系统在核实的时候启动或从后台挂起状态移除掉。在fetch模式下,系统会利用有效的信息来决定启动或激活程序的最佳时期。支持remote-notification的程序,可以在接收到推送消息的时候被唤醒,但在用户接收到推送消息之前,程序可以通过定期获取的形式下载最新内容,并在随后的推送消息之前就已经准备好将内容展现给用户。
IOS7还有2个需要注意的区别:
1、IOS7以前,应用进入后台继续运行时,如果用户锁屏了,那么IOS会等待应用运行完,才进入睡眠状态。而在IOS7上,系统会很快进入睡眠状态,哪些后台应用也就暂停了。如果收到事件被唤醒(例如定时事件,推送、位置更新等),后台应用才能继续运行一会。
2、由于app switcher的存在,应用即使在后台。用户仍然能看到退出前的快照。