1. background Task的使用

1) Background Task仅用于执行短时间的任务,APP切换到后台后,可以通过beginBackgroundTaskWithExpirationHandler申请一段时间的后台时间,你的任务应该在这段时间内执行完成,否则会被系统杀死。

2) Background Task的持续时间并不是一个固定值,在不同性能的设备上差别巨大。在iPhone 10上为30秒,这个是我自己测试的,据说,在高性能的设备上则达到180秒。最长持续时间似乎还和当前的资源占用情况有关。

3)beginBackgroundTask和endBackgroundTask必须成对出现如果使用全局的UIBackgroundTaskIdentifier记录后台任务,需要注意每次执行beginBackgroundTask都会生成新的UIBackgroundTaskIdentifier。旧的UIBackgroundTaskIdentifier会被覆盖,则上一个UIBackgroundTaskIdentifier就没有机会执行endBackgroundTask。此时会出现beginBackgroundTask和endBackgroundTask不配对的情况,可能会被系统杀死。

代码试例:

app进入后台后启动定时器,每隔一秒角标加一

@property (nonatomic, strong) dispatch_source_t badgeTimer;//方法一
@property (nonatomic, assign) UIBackgroundTaskIdentifier bgTask;- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{......................................................//注册推送,设置角标也需要 不角标显示不了if(version >= 10.0){UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];[center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {if (error) { NSLog(@"request authorization error: %@", error); }}];[[UIApplication sharedApplication] registerForRemoteNotifications];}else if (version >= 8.0){UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];[[UIApplication sharedApplication] registerUserNotificationSettings:settings];[[UIApplication sharedApplication] registerForRemoteNotifications];}......................................................
}....................//进入前台,结速后台任务
- (void) applicationWillEnterForeground:(UIApplication *)application
{[self endBackgroundTask];if(_badgeTimer){dispatch_source_cancel(_badgeTimer);_badgeTimer = nil;}
}//进入后台,开始后台任务,启动定时器每隔一秒给角标加一
- (void)applicationDidEnterBackground:(UIApplication *)application {//方法一[self stratBadgeNumberCount];[self startBgTask];
}//启动定时器,任务
- (void)stratBadgeNumberCount{[UIApplication sharedApplication].applicationIconBadgeNumber = 0;if(_badgeTimer){dispatch_source_cancel(_badgeTimer);_badgeTimer = nil;}//定时器增加角标_badgeTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());dispatch_source_set_timer(_badgeTimer, DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC, 1 * NSEC_PER_SEC);dispatch_source_set_event_handler(_badgeTimer, ^{[UIApplication sharedApplication].applicationIconBadgeNumber++;});dispatch_resume(_badgeTimer);
}#pragma mark - 方法一//开启后台任务
- (void)startBgTask{UIApplication *application = [UIApplication sharedApplication];if(_bgTask != UIBackgroundTaskInvalid){[self endBackgroundTask];}_bgTask = [application beginBackgroundTaskWithExpirationHandler:^{NSLog(@"%f",application.backgroundTimeRemaining);[self endBackgroundTask];}];
}//结束后台任务
- (void) endBackgroundTask
{UIApplication *application = [UIApplication sharedApplication];[application endBackgroundTask:_bgTask];_bgTask = UIBackgroundTaskInvalid;
}

2 Background Mode

启用Background Mode后(音频播放、后台定位、VoIP等),是没有后台时间限制的。

在Xcode 配置 background mode

下面以AVAudioPlayer 为例演示app进入后台后,音乐一直播放。app的角标也在增加

//方法二
@property (nonatomic, strong) AVAudioPlayer *player;//进入后台,开始后台任务,启动定时器每隔一秒给角标加一
- (void)applicationDidEnterBackground:(UIApplication *)application {//方法二
[self stratBadgeNumberCount];
[self.player play];}- (void)stratBadgeNumberCount{[UIApplication sharedApplication].applicationIconBadgeNumber = 0;if(_badgeTimer){dispatch_source_cancel(_badgeTimer);_badgeTimer = nil;}//定时器增加角标_badgeTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());dispatch_source_set_timer(_badgeTimer, DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC, 1 * NSEC_PER_SEC);dispatch_source_set_event_handler(_badgeTimer, ^{[UIApplication sharedApplication].applicationIconBadgeNumber++;});dispatch_resume(_badgeTimer);
}#pragma mark - 方法二
- (AVAudioPlayer *)player{if (!_player){NSURL *url=[[NSBundle mainBundle]URLForResource:@"work5.mp3" withExtension:nil];_player = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:nil];[_player prepareToPlay];//一直循环播放_player.numberOfLoops = -1;AVAudioSession *session = [AVAudioSession sharedInstance];[session setCategory:AVAudioSessionCategoryPlayback error:nil];[session setActive:YES error:nil];}return _player;
}

iOS 后台运行 Background Task与Background Mode相关推荐

  1. IOS后台运行 之 后台播放音乐

    IOS后台运行 之 后台播放音乐 iOS 4开始引入的multitask,我们可以实现像ipod程序那样在后台播放音频了.如果音频操作是用苹果官方的AVFoundation.framework实现,像 ...

  2. iOS 后台运行实现总结

    原文:http://www.jianshu.com/p/d3e279de2e32 iOS 后台运行的规则 应用的运行状态分为以下五种: Not running:应用还没有启动,或者应用正在运行但是途中 ...

  3. iOS 后台运行保活

    前言 iOS有两种后台运行保活方式,第一种叫无声音乐保活(即在后台开启音频播放,只不过不需要播放出音量且不能影响其他音乐播发软件),第二种叫Background Task,但是这种方法在iOS 13以 ...

  4. iOS后台运行NSTimer

    iOS 允许的几种后台 几种后台存活的模式 ios7之后(一个app可以混合调用多种模式):Background Audio.VoIP.Location Services.Newsstand.Back ...

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

    一.iOS的"伪后台"程序 首先,先了解一下iOS 中所谓的「后台进程」到底是怎么回事吧? Let me be as clear as I can be: the iOS mult ...

  6. IOS 后台运行 播放音乐

    iOS 4开始引入的multitask,我们可以实现像ipod程序那样在后台播放音频了.如果音频操作是用苹果官方的AVFoundation.framework实现,像用AvAudioPlayer,Av ...

  7. iOS 后台运行一段时间(不是地图,音乐类型APP)

    iOS 通常是不能在后台运行的,尤其是用户点击锁屏键,APP进入后台,网络立马断开等.如何解决这个问题呢?在APP进入后台,APP怎么争取一些时间来"善后".代码如下:注:需要定义 ...

  8. IOS后台运行机制详解(二)

    (温馨提示:亲,请先看上篇,此文乃下篇) 三.iOS长时间后台运行的实现代码 1.检查设备是否支持多任务 Apple出于性能的考虑,并不是所有的iOS设备升级到iOS4以后都支持多任务,比如iPhon ...

  9. iOS后台运行机制1

    iOS支持三种后台运行方式: audio:在后台提供声音播放功能,包括音频流和播放视频时的声音 location:在后台可以保持用户的位置信息 voip:在后台使用VOIP功能 一.iOS的" ...

最新文章

  1. QTreeWidget 读取windows注册表
  2. Azure平台管理员必须了解的安全问题
  3. fileupload java_java组 fileupload
  4. getopt( )和 getopt_long( )
  5. 以前的某个程序安装计算机上创建挂起_教研拓进王立辉老师计算机专业教学心得...
  6. 基于Knative开发应用
  7. AHU_OJ 434
  8. 如何获取android源码
  9. Hibernate 入门 特性配置
  10. 服务器温度检测软件_科技产品—整机柜服务器—产品简介
  11. HTML5——用a标签在当前网页跳转和打开新页面再跳转
  12. mysql 字典表设计_字典表设计
  13. Win10下安装centos7双系统
  14. 研发岗和产品岗的时间管理策略总结-大局观概述
  15. (bug更正)利用KVC和associative特性在NSObject中存储键值
  16. 【面试问题】进程和线程的区别——通俗易懂
  17. python重装之前要卸载吗_关于fedroa下安全地卸载和重装python
  18. 三分钟告诉你为什么再昂贵的普洱茶都只是用棉纸包装?
  19. maya为什么不能导出fbx_maya无法导出fbx
  20. Java常用消息摘要算法-MD5

热门文章

  1. POE直流供电后段整流电路(含网络变压器供电)示意图
  2. Mysql数据库SaaS多租户实现方案
  3. (附源码)计算机毕业设计SSM中小学家校通系统
  4. 【那些年,我们一起追的女孩】第三章
  5. 报考PMP怕上当,都会遇到哪些坑,我该如何避开这些坑?
  6. TOJ4309 表达式求值 stack
  7. 跟益达学Solr5之索引文件夹下所有文件
  8. 分享:笔记本花屏的解决方法
  9. 最最最基础的C++代码
  10. Java年薪30W+面试必问知识之《2020年面试宝典总纲》