参考: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后台运行的更多相关文章

  1. IOS App 后台运行

    使用block的另一个用处是可以让程序在后台较长久的运行.在以前,当app被按home键退出后,app仅有最多5秒钟的时候做一些保存或清理资源的工作.但是应用可以调用UIApplication的beg ...

  2. ios程序后台运行设置(不是太懂)

    文一 我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时间. 还有三种类型的可以运行在后以, 1.音乐 2.location 3.voip 文 ...

  3. IOS微信后台运行时候倒计时暂停问题

    链接:https://pan.baidu.com/s/1i7cSkqL 密码:g80i 最近给央视做了个H5答题游戏,但在倒计时上遇到一个终端问题:手机端按Home键将微信收入后台之后,IOS11 会 ...

  4. iOS开发小结 - 让你的APP后台运行

    最近项目有个需求需要让app在后台一直运行计时着,找了一些资料,只能用比较无耻的做法了,播放一段没有声音的音频文件,这样你的APP就不会被系统杀掉~~ 我们只需要用到<AVFoundation/ ...

  5. iOS中后台运行

    iOS在升级到4.0以后就支持了多任务了.下文将详细介绍一下这个特性. 1.检查设备是否支持多任务 Apple出于性能的考虑,并不是所有的iOS设备升级到iOS4以后都支持多任务,比如iPhone 3 ...

  6. App后台运行通知函数

    
[[UIApplicationsharedApplication] beginBackgroundTaskWithExpirationHandler: ^() { //程序在10分钟内未被系统关闭或 ...

  7. Html5+ 开发APP 后台运行代码

    function backRunning(){ if(plus.os.name == 'Android'){ var main = plus.android.runtimeMainActivity() ...

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

    第一部分 1.先说说iOS 应用程序5个状态: 停止运行-应用程序已经终止,或者还未启动. 不活动-应用程序处于前台但不再接收事件(例如,用户在app处于活动时锁住了设备). 活动-app处于“使用中 ...

  9. IOS高级开发~开机启动&无限后台运行&监听进程

    一般来说, IOS很少给App后台运行的权限. 仅有的方式就是 VoIP. IOS少有的为VoIP应用提供了后台socket连接,定期唤醒并且随开机启动的权限.而这些就是IOS上实现VoIP App的 ...

随机推荐

  1. 解决download.msdn.microsoft.com无法正确解析而无法下载的问题

    不知何时,微软 MSDN 订阅软件下载服务IP解析有问题,总是在点击“下载”按钮之后无法打开. 想必又跟“国情”有关,我是使用联通宽带,没测试过电信的. 我是可以通过指定hosts entry来解决: ...

  2. 使用awk统计字段重复实践

    awk awk是一种规格化文件的分析工具, 主要处理对象类似数据库导出的条目文本文件, 其中一行,就对应一个记录,每个记录包含若干个字段. 类似这种文本: [root@www ~]# last -n ...

  3. 记32位程序(使用3gb用户虚拟内存)使用D3DX9导致的一个崩溃的问题

    为了增加32位程序的用户虚拟内存的使用量,我们使用了/LARGEADDRESSAWARE编译选项来使32位程序可能使用到3gb的内存,能否使用到3gb内存也跟平台.系统和设置有关系,现摘抄部分作为参考 ...

  4. 根据执行计划优化sql语句

    优化前:表连接使用merge SQL> alter session set statistics_level=all; Session altered. SQL> select e.sal ...

  5. WPF 基础面试题及答案(一)

    一 · WPF由哪两部分组成? wpf 由两个主要部分 组成:引擎和编程框架. 1 引擎.wpf引擎是基于窗体的应用程序 图形 视频 音频和文档提供了一个单一的运行时库.重要的是WPF基于矢量的呈现引 ...

  6. Java基础之写文件——使用Formatter对象加载缓冲区(UsingAFormatter)

    控制台程序,使用Formatter对象将写入文件的数据准备好. 使用Formatter对象的format()方法,将数据值格式化到视图缓冲区charBuf中. import static java.n ...

  7. G面经prepare: Set Intersection && Set Difference

    求两个sorted数组的intersection e.g. [1,2,3,4,5],[2,4,6] 结果是[2,4] difference 类似merge, 分小于等于大于三种情况,然后时间O(m+n ...

  8. [Reprint]C++函数前和函数后加const修饰符区别

    c++中关于const的用法有很多,const既可以修饰变量,也可以函数,不同的环境下,是有不同的含义.今天来讲讲const加在函数前和函数后面的区别.比如: 01 #include<iostr ...

  9. Java基础(3):求任意数字的长度的三种方法

    题目:统计任意一个数字的长度 方法一:先把数字转换为字符换,再直接用现成的函数统计长度即可 方法二:用API public class Test { final static int[] sizeTa ...

  10. Undefined index:

    $username=$_POST["username"]; 初学时发现这个错误, Undefined index: username 如果不仔细看,还以为是$username报错, ...