zoukankan      html  css  js  c++  java
  • [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 应用在后台继续运行需要有充分的理由,否则可能审核不通过~~~

  • 相关阅读:
    log4j日志格式化
    日志级别是如何工作?
    Java拦截过滤器模式
    js实现图片轮播
    js实现表格的增删改查
    企业外贸网站建设的要求及注意事项
    逛知乎才知网站建设不只有wordpress建站系统,小白值得收藏
    三款适用于企业建站的CMS建站系统
    前端开发常用的网站整理
    网站建设教程:虚拟主机如何安装PageAdmin建站系统
  • 原文地址:https://www.cnblogs.com/lyggqm/p/5217248.html
Copyright © 2011-2022 走看看