[ios]app后台运行
参考:http://www.douban.com/note/375127736/
1 使用开源代码MMPDeepSleepPreventer
将文件加入工程,包括音频文件。
可以在源文件中加入单例,便于使用:
+ (MMPDeepSleepPreventer *)sharedSingleton
{
static MMPDeepSleepPreventer * _sharedSingleton = nil;
@synchronized([MMPDeepSleepPreventer class]){
if (_sharedSingleton == nil) {
_sharedSingleton = [MMPDeepSleepPreventer alloc] init];
}
}
return _sharedSingleton;
}
2 导入AVFoundation.framework
3 用文本编辑器打开你工程的info.plist文件
加入
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
</array>
后保存。
4 在AppDelegate.m中
- (void)applicationDidEnterBackground:(UIApplication *)application里加入
[MMPDeepSleepPreventer sharedSingleton] startPreventSleep]; (或者切换到后台的时候加入更严格的判断,需要应用在后台运行时才调用)
- (void)applicationDidBecomeActive:(UIApplication *)application里加入
[MMPDeepSleepPreventer sharedSingleton] stopPreventSleep];
5 如果正在听音乐,比如百度音乐,这个时候启动的你的app,然后再切到后台,这个时候百度音乐会停。解决这个问题,需要调整MMPDeepSleepPreventer.m中代码的顺序。具体是mmp_setUpAudioSession中,先执行:
NSError *categorySetError = nil;
[audioSession setCategory:AVAudioSessionCategoryPlayback
withOptions:AVAudioSessionCategoryOptionMixWithOthers
error:&categorySetError];
if (categorySetError) {
MMPALog(@"Error setting AVAudioSession category: %@", categorySetError);
}
再执行:
NSError *activeSetError = nil;
[audioSession setActive:YES
error:&activeSetError];
if (activeSetError) {
MMPALog(@"Error activating AVAudioSession: %@", activeSetError);
}
在else分支里,把
// Activate audio session
OSStatus activationResult = 0;
activationResult = AudioSessionSetActive(true);
if (activationResult)
{
MMPDLog(@"AudioSession is active");
}
放到最后执行。
6 修改启动和终止函数为:
- (void)startPreventSleep
{
[self.audioPlayer play];
}
- (void)stopPreventSleep
{
[self.audioPlayer stop];
}
由于初始化过程中
self.audioPlayer.numberOfLoops = -1;
即无限循环播放,所以源码中的定时器根本没起作用,而且调用stopPreventSleep也没有真正stop,实际上一直在播放,所以要如上修改。
7 订阅通知:
[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioSessionWasInterrupted:) name:AVAudioSessionInterruptionNotification object:nil];
- (void)dealloc
{
[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)audioSessionWasInterrupted:(NSNotification *)notification
{
if ([notification.userInfo count] == 0)
{
return;
}
if (AVAudioSessionInterruptionTypeEnded == [notification.userInfo[AVAudioSessionInterruptionTypeKey] intValue])
{
NSLog(@"received AVAudioSessionInterruptionTypeEnded -------------------");
dispatch_async(dispatch_get_main_queue(), ^{
[self startPreventSleep];
});
}
}
这样接打电话和闹钟响后音乐会恢复播放,后台任务可继续运行。
8 应用在后台继续运行需要有充分的理由,否则可能审核不通过~~~
[ios]app后台运行的更多相关文章
- IOS App 后台运行
使用block的另一个用处是可以让程序在后台较长久的运行.在以前,当app被按home键退出后,app仅有最多5秒钟的时候做一些保存或清理资源的工作.但是应用可以调用UIApplication的beg ...
- ios程序后台运行设置(不是太懂)
文一 我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时间. 还有三种类型的可以运行在后以, 1.音乐 2.location 3.voip 文 ...
- IOS微信后台运行时候倒计时暂停问题
链接:https://pan.baidu.com/s/1i7cSkqL 密码:g80i 最近给央视做了个H5答题游戏,但在倒计时上遇到一个终端问题:手机端按Home键将微信收入后台之后,IOS11 会 ...
- iOS开发小结 - 让你的APP后台运行
最近项目有个需求需要让app在后台一直运行计时着,找了一些资料,只能用比较无耻的做法了,播放一段没有声音的音频文件,这样你的APP就不会被系统杀掉~~ 我们只需要用到<AVFoundation/ ...
- iOS中后台运行
iOS在升级到4.0以后就支持了多任务了.下文将详细介绍一下这个特性. 1.检查设备是否支持多任务 Apple出于性能的考虑,并不是所有的iOS设备升级到iOS4以后都支持多任务,比如iPhone 3 ...
- App后台运行通知函数
[[UIApplicationsharedApplication] beginBackgroundTaskWithExpirationHandler: ^() { //程序在10分钟内未被系统关闭或 ...
- Html5+ 开发APP 后台运行代码
function backRunning(){ if(plus.os.name == 'Android'){ var main = plus.android.runtimeMainActivity() ...
- iOS开发:后台运行以及保持程序在后台长时间运行
第一部分 1.先说说iOS 应用程序5个状态: 停止运行-应用程序已经终止,或者还未启动. 不活动-应用程序处于前台但不再接收事件(例如,用户在app处于活动时锁住了设备). 活动-app处于“使用中 ...
- IOS高级开发~开机启动&无限后台运行&监听进程
一般来说, IOS很少给App后台运行的权限. 仅有的方式就是 VoIP. IOS少有的为VoIP应用提供了后台socket连接,定期唤醒并且随开机启动的权限.而这些就是IOS上实现VoIP App的 ...
随机推荐
- LaunchImage命名与AppIcon命名(ios设置 启动图片和AppIcon图片)
LaunchImage AppIcon 分别拖拉至Images.scassets 对应的LaunchImage和AppIcon就可以设置 启动图片和AppIcon图片
- throw 子句
throws是声明方法时抛出可能出现的异常,但不能捕获异常,也就是说并不直接处理异常,而是把它向上传递.其格式如下: 方法声明 throws 异常类名列表 若一个方法声明抛出异常,则表示该方法可能会抛 ...
- git提交
1.git pull 本地已经commit 2.git checkout master 3.git pull 4.git checkout - 5.git merge master 6.git pus ...
- 关于伪类元素:before和:after
关于伪类元素:before和:after CSS中存在一些比较特殊的属性,称之为伪类,它们之中最常用的就是定义链接的伪 :link:未被访问状态 :visited:已被访问状态 :hover:鼠标 ...
- 如何用Java解析CSV文件
首先看一下csv文件的规则: csv(Comma Separate Values)文件即逗号分隔符文件,它是一种文本文件,可以直接以文本打开,以逗号分隔.windows默认用excel打开.它的格式包 ...
- 20145207 《Java程序设计》第8周学习总结
前言: 这两天电路焊小车,有意思归有意思,确实挺忙的.博客到现在才写.执勤看的东西忘得好快呀,莫名的记不住.不说废话了,开始. 教材学习内容总结: 一.NIO和NIO2 1.NIO的定义 InputS ...
- UML:组件图
要搞清楚组件图,必须先搞清楚什么是组件? 组件有以下特点:1.能实现一定功能,或者提供一些服务.2.不能单独运行,要作为系统的一部分来发挥作用.3.在物理上独立的,不是逻辑上的概念.4.可单独维护.可 ...
- WebDriver:org.openqa.selenium.firefox.NotConnectedException: Unable to connect to host 127.0.0.1 on port 7055 after 45000 ms
今天尝试最新的webDriver与fireFox搭配: 运行代码时出现如下的问题,但是浏览器却可以打开: org.openqa.selenium.firefox.NotConnectedExcepti ...
- ZOJ 3645 BiliBili(高斯消元)
Shirai Kuroko is a Senior One student. Almost everyone in Academy City have super powers, and Kuroko ...
- linux下创建的符号链接的权限
今天为shell脚本创建符号链接的时候突然发现的, 创建的符号链接文件的默认权限是 777, 而想要这个脚本可执行, 必须为真正的文件加上 x 权限才可以.