ios background task 后台多任务

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 currentDevicerespondsToSelector:@selector(isMultitaskingSupported)]) {

        result = [[UIDevice currentDevicerespondsToSelector:@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这个属性可以获取此后台任务还剩余的时间(当此值变成0expirationHandler就被执行)

    

    // 如果还没到限制时间就完成了我们需要在后台完成的任务,可以提前调用endBackgroundTask,结束后台任务。

    endBackgroundTask();

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值