在之前的文章《App
States and Multitasking IOS应用程序状态和多任务》
说到IOS程序有前台后台之分。在IOS程序进入后台之后,程序就会不执行代码,如果非要有什么必须执行的过程,可以申请大约600s的时间,如果在这段时间内程序还没有完成则会被系统杀死。出现:has active assertions beyond permitted time.
更多IOS后台内容参考:<IOS7
Background Fetch后台应用程序刷新> <IOS
7四种后台机制>
进入后台后,NSTimer等就不会起作用。
网络上有不少地方提到在进入后台的方法:
- (void)applicationDidEnterBackground:(UIApplication *)application
添加如下代码就可以保持定时器在后台正常工作:
1 | UIApplication* app = [UIApplication sharedApplication]; |
在测试的过程中,使用以上方法程序后台运行大约600s之后被系统kill。
实际上上面这段代码执行的效果就是申请额外的运行时间,在后台运行超时后就会被杀死。
不知道第一个写出用这种方式的同学有没有自己试过。
在测试时发现,考察进入后台的状态不要用模拟器,也不要在调试状态。
最好打上写文件的日志,真机不带调试的测,那样才是真正的进入到后台的状态。
关于IOS程序后台长时间运行的问题,这两天的了解结果是:除了IOS支持的audio音频,location位置定位,voip等少数几个功能,其他都很难办到。
其中,使用audio音频,location位置定位等后台服务的时候需要配置plist文件增加Required background modes键,并添加App registers for location updates,App plays audio or streams audio/video using AirPlay两个键值。
App registers for location updates主要是针对定位服务类CLLocationManager,
有新位置会调用-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations方法,在该方法内部,可以做记录位置数据等工作,这些都可以在后台完成。
App plays audio or streams audio/video using AirPlay
主要是针对音频播放录制类AVAudioPlayer,AVAudioRecorder等,在使用之前首先获取会话
1 | AVAudioSession *session = [AVAudioSession sharedInstance]; |