iOS 如何让一个程序在后台运行不被挂起,不死掉

原创 2016年04月22日 16:05:34

iOS 如何让一个程序在后台运行不被挂起,不死掉

前言:这是本人的第一篇博客,本来对这种写博客这种东西无感,但是发现有些东西如果不晒在网上,会让很多人费很多的时间去找一种问题的解决方法,于是我决定不做一个伸手党。

支持原创,转载就注明出处。

  • 苹果后台运行的原理
  • 如何解决
  • 代码实现

苹果后台运行的原理

大家都知道,当一个程序进入后台时,除了一些特定的操作比如用户的音频,定位等能够在info.plist里修改设置进行后台操作以外,其他的很难能够进行获取,比如下载一个东西,就比如我们知道的某视频播放器(这里为了排除广告嫌疑,不进行提名)也不能完成后台挂起状态的缓存,我个人觉得这点优化的不是很好。有的人应该知道苹果哪怕后台挂起一个东西,在appdelegate 里进入后台执行的方法,也只能存活600s。
进入后台执行的代理方法是

- (void)applicationDidEnterBackground:(UIApplication *)application
{

}

我们可以在这个代理方法里进行一些后台执行的操作,但是只有600s 的存活时间。

如何解决

假如在appdelegate的代理方法里开启一个后台任务

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    //开启一个后台任务
    taskId = [application beginBackgroundTaskWithExpirationHandler:^{


    }];  
}
//下面是声明的任务ID
UIBackgroundTaskIdentifier taskId;

在任务结束的时候会回调block,所以也就是说600s 以后会回调。我们需要做的就是在程序还未进行到600s 还未死掉的时候进行一个结束程序,新建一个后台程序的操作,这样以来程序就能无止境的在后台进行运行,你可以做一系列的操作。下面废话不多说,我把写的一个Demo的例子粘在下面,请大家参考,有不懂得可以提问。

//进入后台模式的代理

UIBackgroundTaskIdentifier taskId;

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    //开启一个后台任务
    taskId = [application beginBackgroundTaskWithExpirationHandler:^{

        //结束指定的任务
        [application endBackgroundTask:taskId];
    }];

    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];    
}

//定时器的方法

- (void)timerAction:(NSTimer *)timer {
    count++;

    if (count % 500 == 0) {
        UIApplication *application = [UIApplication sharedApplication];
        //结束旧的后台任务
        [application endBackgroundTask:taskId];

        //开启一个新的后台
        taskId = [application beginBackgroundTaskWithExpirationHandler:NULL];
    }

    NSLog(@"%d",count);
}

其实很简单,这个demo就是给一个定时器让它一直打印,如果不来回关闭任务创建任务程序会在600s 以后死掉,但是做此操作之后程序就会一直在后台执行。
PS:写在Appdelegate里面不要忘了给self.window 一个rootViewController.

希望可以帮到需要的人,第一次写博客,有什么不足的地方希望大家及时指出,也希望大家多多支持。
分享牛,分享、我们是快乐的。

版权声明:本文为博主原创文章,未经博主允许不得转载。

iOS 后台长久运行

在以前,当应用被Home键退出后,应用仅有最多5秒的时间做一些保存活清理资源的工作。但是应用可以调用UIApplication的 beginBackgroundTaskWithExpiratio...
  • DoubleK_duo
  • DoubleK_duo
  • 2017年05月03日 14:24
  • 1168

iOS 后台运行实现总结

原文:http://www.jianshu.com/p/d3e279de2e32 iOS 后台运行的规则 应用的运行状态分为以下五种: Not running:应用还没有启动,或者应...
  • u011270282
  • u011270282
  • 2017年03月29日 16:44
  • 947

iOS程序后台运行继续完成操作

我们知道,到我们程序从前台退到后台(安home)键后,将执行程序的委托方法。 // 当应用程序掉到后台时,执行该方法 - (void)applicationDidEnterBackgrou...
  • qq_32385309
  • qq_32385309
  • 2016年06月17日 10:44
  • 3235

iOS开发:后台运行以及保持程序在后台长时间运行

第一部分 1.先说说iOS 应用程序5个状态: 停止运行-应用程序已经终止,或者还未启动。 不活动-应用程序处于前台但不再接收事件(例如,用户在app处于活动时锁住了设备)。 ...
  • benbenxiongyuan
  • benbenxiongyuan
  • 2016年05月20日 11:14
  • 2836

iOS让你的app一直在后台活着(运行)

准备工作: 1.导入AVFoundation.framework 2.导入一个无声音乐文件 (.mp3) 3.上代码 #import "AppDelegate.h" #import ...
  • IOS_dashen
  • IOS_dashen
  • 2015年12月18日 15:43
  • 4494

iOS后台持续永久运行

  • 2015年07月03日 08:44
  • 435KB
  • 下载

IOS后台运行机制详解(一)

一、IOS的“伪后台”程序 首先,先了解一下iOS 中所谓的「后台进程」到底是怎么回事吧? Let me be as clear as I can be: the iOS multitasking...
  • enuola
  • enuola
  • 2013年06月21日 22:22
  • 50963

IOS的后台运行

文一   我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时间。   还有三种类型的可以运行在后以,   1.音乐   2.locat...
  • xyxjn
  • xyxjn
  • 2014年07月21日 18:08
  • 19848

iOS开发:后台运行以及保持程序在后台长时间运行

第一部分 1.先说说iOS 应用程序5个状态: 停止运行-应用程序已经终止,或者还未启动。 不活动-应用程序处于前台但不再接收事件(例如,用户在app处于活动时锁住了设备)。 活动-app...
  • mgr406176009
  • mgr406176009
  • 2016年11月04日 17:31
  • 807

iOS 后台运行实现总结

iOS 后台运行的规则 应用的运行状态分为以下五种: Not running:应用还没有启动,或者应用正在运行但是途中被系统停止。 Inactive:当前应用正在前台运行,但是并不接收事件(...
  • mgr406176009
  • mgr406176009
  • 2016年11月09日 14:44
  • 348
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS 如何让一个程序在后台运行不被挂起,不死掉
举报原因:
原因补充:

(最多只允许输入30个字)