iOS app有5种状态,分别是not running, inactive, active, background, suspended
推送
苹果提供的的PUSH机制,叫APNS。腾讯的QQ和微信就是使用这种方式。实际上,使用长连接会更好,但是苹果不支持。当应用已经suspended,但是当接收到push的数据以后,会短暂地回到background进行处理,处理完毕以后又回到suspended状态。
特定的多任务
某些特定的任务可以在后台长时间运行,比如VOIP, location service等,只有特定类型的任务,才能用这种方式。
task completion
通常情况下,应用在进入background之后,很快就会转到suspended状态。但是,如果应用有需要的话,可以向系统申请一点额外的时间来完成当前的任务。
// 判断当前设备是否支持后台多任务
- (BOOL)isMutiltaskingSupported
{
BOOL result = NO;
if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]) {
result = [[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)];
}
return result;
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
__block UIBackgroundTaskIdentifier bgTask; // 后台任务标识
// 结束后台任务
void (^ endBackgroundTask)() = ^() {
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
};
// 后台运行的核心方法,注册一个后台任务,这个任务是有时间限制的,如果超时,会调用block,
// 在block中必须调用 -(void)endBackgroundTask:(UIBackgroundTaskIdentifier)identifier;
// 否在,应用汇crash
bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
endBackgroundTask();
}];
// 可以使用@property(nonatomic,readonly) NSTimeInterval backgroundTimeRemaining这个属性可以获取此后台任务还剩余的时间(当此值变成0,expirationHandler就被执行)
// 如果还没到限制时间就完成了我们需要在后台完成的任务,可以提前调用endBackgroundTask,结束后台任务。
endBackgroundTask();
}