后台运行

app可以在后台保留10分钟,但线程停止。

例如做手机验证码倒计时,退到后台后倒计时停止一直到进入前台才再次倒计,不符合需求,此时需要申请线程继续。


1.

@property (nonatomic, unsafe_unretained) UIBackgroundTaskIdentifier backgroundTaskIdentifier;

2.

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

_istip4gpingcancel = NO;

// 使用这个方法来释放公共的资源、存储用户数据、停止我们定义的定时器(timers)、并且存储在程序终止前的相关信息。

// 如果,我们的应用程序提供了后台执行的方法,那么,在程序退出时,这个方法将代替applicationWillTerminate方法的执行。

// 标记一个长时间运行的后台任务将开始

// 通过调试,发现,iOS给了我们额外的10分钟(600s)来执行这个任务。

self.backgroundTaskIdentifier =[application beginBackgroundTaskWithExpirationHandler:^(void) {

// 当应用程序留给后台的时间快要到结束时(应用程序留给后台执行的时间是有限的), 这个Block块将被执行

// 我们需要在次Block块中执行一些清理工作。

// 如果清理工作失败了,那么将导致程序挂掉

// 清理工作需要在主线程中用同步的方式来进行

[self endBackgroundTask];

}];

}

- (void) endBackgroundTask{

dispatch_queue_t mainQueue = dispatch_get_main_queue();

AppDelegate *weakSelf = self;

dispatch_async(mainQueue, ^(void) {

AppDelegate *strongSelf = weakSelf;

if (strongSelf != nil){

// 每个对 beginBackgroundTaskWithExpirationHandler:方法的调用,必须要相应的调用 endBackgroundTask:方法。这样,来告诉应用程序你已经执行完成了。

// 也就是说,我们向 iOS 要更多时间来完成一个任务,那么我们必须告诉 iOS 你什么时候能完成那个任务。

// 也就是要告诉应用程序:“好借好还”嘛。

// 标记指定的后台任务完成

[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskIdentifier];

// 销毁后台任务标识符

strongSelf.backgroundTaskIdentifier = UIBackgroundTaskInvalid;

}

});

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 文一 我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时...
    Kloar阅读 1,608评论 0 1
  • 前言 对于APP的前后台运行情况的了解,有助于我们在实际开发中规避一些问题,以及采取稳妥的方法处理和解决问题,是很...
    進无尽阅读 3,481评论 7 12
  • 先介绍一篇关于后台运行的文章:http://www.jianshu.com/p/174fd2673897 此篇文章...
    情来情去情随缘阅读 6,411评论 20 11
  • 很多使用iphone的孩纸,可能并不了解iphone的后台运行机制。今天转载一篇网友的文章,来扫盲一下。 标注来源...
    银千特iv阅读 11,769评论 2 10
  • 以下是个人总结不完全的快捷键总汇,祝愿各位顺利解放自己的鼠标。 选择类 Ctrl+D 选中光标所占的文本,继续操作...
    寒剑飘零阅读 301评论 1 1

友情链接更多精彩内容