iOS 后台任务

作者: 东健FO_OF | 来源:发表于2017-07-04 10:43 被阅读307次

写之前先声明一下:OC是最好的语言!🤔
iPhone向来是如此的流畅,就算是我手里如此垃圾的iPhone5S,1G内存也能听着歌,开着QQ,聊着微信,还可以打一把王者农药,然后还可以上来刷一刷简书的博客,好了进入正题:

那么iPhone流畅的原因是什么呢?我想很大一部分原因是iPhone严格的后台运行保护机制,绝大部分程序在后台都撑不过10分钟,所以实际上只运行了一个程序,那肯定不卡了。

不过我们目前的主题不是这个,作为开发者的我绝对忍受不了它3秒钟都不给我的态度😡😡,只要一退到后台,所有线程立马被挂起!!太傲娇了,既然有10分钟,那么就一定要争取到!上代码:

向iOS申请,在后台完成一个Long-Running Task任务
1.项目的AppDelegate.h文件中

@interface AppDelegate ()

@property (nonatomic, unsafe_unretained) UIBackgroundTaskIdentifier backgroundTaskIdentifier;

@property (nonatomic, strong) NSTimer *myTimer;

@end

2、在 AppDelegate 的 applicationDidEnterBackground 方法中调用我们需要后台执行的方法:

self.backgroundTaskIdentifier =[application beginBackgroundTaskWithExpirationHandler:^(void) {
        //当后台时间要结束的时候就会调用这个Block
        //此时我们需要结束后台任务,
        [self endBackgroundTask];
    }];
// 模拟一个Long-Running Task
    self.myTimer =[NSTimer scheduledTimerWithTimeInterval:1.0f
                                                   target:self
                                                 selector:@selector(timerMethod:)
                                                 userInfo:nil
                                                  repeats:YES];

注意这里不能企图开任何的线程来调用方法,因为所有的线程都会被挂起

3、实现后台任务结束的方法
后台任务一结束,我们首先需要释放定时器,然后告诉iOS我们的任务已经完成了,下面是实现部分:

- (void) endBackgroundTask{
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    AppDelegate *weakSelf = self;
    dispatch_async(mainQueue, ^(void) {
        AppDelegate *strongSelf = weakSelf;
        if (strongSelf != nil){
            [strongSelf.myTimer invalidate];// 停止定时器
            // 每个对 beginBackgroundTaskWithExpirationHandler:方法的调用,必须要相应的调用 endBackgroundTask:方法。这样,来告诉应用程序你已经执行完成了。
            // 也就是说,我们向 iOS 要更多时间来完成一个任务,那么我们必须告诉 iOS 你什么时候能完成那个任务。
            // 标记指定的后台任务完成
            [[UIApplication sharedApplication]endBackgroundTask:self.backgroundTaskIdentifier];
            // 销毁后台任务标识符
            strongSelf.backgroundTaskIdentifier = UIBackgroundTaskInvalid;
        }
    });
}

// 模拟的一个 Long-Running Task 方法

- (void) timerMethod:(NSTimer *)paramSender{
    
    // backgroundTimeRemaining 属性包含了程序留给的我们的时间
    NSTimeInterval backgroundTimeRemaining =[[UIApplication sharedApplication]backgroundTimeRemaining];
    
    if (backgroundTimeRemaining == DBL_MAX){
        
        NSLog(@"Background Time Remaining = Undetermined");
        
    } else {
        
        NSLog(@"Background Time Remaining = %.02f Seconds", backgroundTimeRemaining);
        
    }
}

到这里后台任务就算执行成功了,不会一退到后台就会被挂起,附上demo地址:【下载demo

相关文章

  • iOS app退到后台被杀相关问题

    前言 iOS提供了后台任务的机制,利用后台任务,App可以在用户退后台后有一小段时间进行一些必要的逻辑处理(经过测...

  • iOS后台任务崩溃处理方式

    iOS App 后台任务的坑 大多数 iOS App 在进入后台之后都会将一些关键任务封装到 Background...

  • iOS 后台任务

    Githup项目地址简书地址 一 iOS 应用的运行状态 Not running 应用还没有启动或者应用正在运行...

  • iOS 后台任务

    写之前先声明一下:OC是最好的语言!?iPhone向来是如此的流畅,就算是我手里如此垃圾的iPhone5S,1G内...

  • ios后台网络任务NSURLSession介绍

    ios后台任务 ios里,基于设备续航和安全方面的考虑,不在前台运行的app会被系统挂起,所有线程进入沉睡态,Io...

  • uap后台任务&&预警平台

    后台任务 【后台任务类型注册】 业务插件:对应的后台任务入口类nc.bs.**.**BGWorkPlugin 关键...

  • iOS 后台任务 BackgroundTask

    iOS app在被用户切换到后台的时候就会处于挂起状态,如果这时你的应用正在进行一个任务中并且需要额外的时间来完成...

  • iOS后台任务beginBackgroundTaskWithEx

    1、标准写法 UIBackgroundTaskIdentifier backgroundUpdateTask;lo...

  • iOS 后台任务总结

    首先Apple官方为我们准备了三类后台任务执行的场景: 1.Background Tasks:APP 在前台时启动...

  • iOS开启后台任务

网友评论

    本文标题:iOS 后台任务

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