美文网首页
iOS 长时间后台运行

iOS 长时间后台运行

作者: winsonGali | 来源:发表于2019-05-31 11:56 被阅读0次
    //
    //  AppDelegate.m
    //  backTask
    //
    //  Created by Winson on 2019/5/30.
    //  Copyright © 2019 Winson. All rights reserved.
    //
    
    #import "AppDelegate.h"
    
    @interface AppDelegate ()
    {
        NSTimer *_timer;
        NSInteger _remainSeconds;
        CGFloat _timeInterval;
    }
    @property(nonatomic, assign)UIBackgroundTaskIdentifier taskIdentifier;
    @end
    
    @implementation AppDelegate
    
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        return YES;
    }
    
    
    - (void)applicationDidEnterBackground:(UIApplication *)application {
        //获取后台剩余时间
        NSTimeInterval remainTime = [[UIApplication sharedApplication] backgroundTimeRemaining];
        NSLog(@"remainTime = %.2f", remainTime);
        //开启后台任务
        self.taskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
            NSLog(@"后台任务即将终止");
        }];
        //10分钟
        _remainSeconds = 10 * 60;
        //开启新的后台任务时间间隔,留点时间在后台结束之前调用,保证成功率
        _timeInterval = ceil(remainTime - 5);
        //开启定时器
        _timer = [NSTimer scheduledTimerWithTimeInterval:_timeInterval target:self selector:@selector(doTimer:) userInfo:nil repeats:YES];
    }
    
    - (void)doTimer:(NSTimer *)sender {
        NSTimeInterval remainTime = [[UIApplication sharedApplication] backgroundTimeRemaining];
        if (remainTime > 0) {
            NSLog(@"remainTime = %.2f", remainTime);
        }
        _remainSeconds -= _timeInterval;
        NSLog(@"_remainSeconds = %ld", (long)_remainSeconds);
        if (remainTime <= 0) {
            self.taskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
                NSLog(@"xxxxx");
                [self endBackgroundUpdateask];
            }];
        }
        if (_remainSeconds <= 0) {
            [_timer invalidate];
            [self endBackgroundUpdateask];
        }
    }
    
    #pragma mark ------------------  结束后台任务 ------------------
    - (void)endBackgroundUpdateask{
        [[UIApplication sharedApplication] endBackgroundTask:self.taskIdentifier];
        self.taskIdentifier = UIBackgroundTaskInvalid;
    }
    @end
    
    

    相关文章

      网友评论

          本文标题:iOS 长时间后台运行

          本文链接:https://www.haomeiwen.com/subject/eydagqtx.html