通过电话ios恢复在后台运行的应用程序

时间:2014-02-25 06:21:05

标签: ios background multitasking interruption

我有一个ios应用程序,当它移动到后台时继续播放音乐。现在,如果有电话,无论是否应答,应用程序都不会恢复播放音乐。 有两天我一直在读这个问题的帖子。他们中没有人解决了我的问题。

我正在使用AVQueuePlayer对象,因为我在需要时也流式播放音乐。 现在,自ios6以来,委托方法已被弃用。所以我正在使用Notications。

令人惊讶的是,通知中断结束(电话结束),播放音乐的代码也会被写入,但应用程序jus不会播放音乐,直到前景(另有通知)

这是我的代码

 -(void)viewWillAppear
 {.....
  ........
   .....
 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioInterruptionNotification:) name:AVAudioSessionInterruptionNotification object:nil];
 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioInterruptionNotification:) name:UIApplicationDidBecomeActiveNotification object:nil]
}

-(void)audioInterruptionNotification:(NSNotification *) aNotification {

NSLog(@"Interrupt %@", aNotification);
NSDictionary *dict = [aNotification userInfo];
NSUInteger typeKey = [[dict objectForKey:@"AVAudioSessionInterruptionTypeKey"] unsignedIntegerValue]; NSLog(@"%d", typeKey);
if (typeKey == 0)
{
        [avPlayer play];
        NSLog(@"1.......");
  }
else if (typeKey == 1)
{
    [avPlayer play];
    NSLog(@"3...............");

    ;
}

}

此外,我尝试通过调度队列引发延迟。 委托方法似乎不起作用。 但是,通过苹果恢复通话后,gaana,saavn和官方音乐应用程序恢复。所以这是可能的。 我似乎错过了一些东西。 如果我使用核心电话。我将不得不添加一个整个框架,这将增加应用程序的大小。 如果这是唯一的方法。请告诉我们如何。

谢谢。我非常感谢你的时间。

2 个答案:

答案 0 :(得分:3)

所以我过了一会儿就回来了,我看到我的问题仍然没有答案。好吧,我已经解决了我的问题。 事实证明这只是一个缺失的简单陈述。

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

以及我在问题中写的代码。

答案 1 :(得分:0)

我已经解决了问题 - 应用程序被电话打断了,音乐消失了怎么样?

  1. 当应用开始时,请致电:
    OSStatus result1 = AudioSessionInitialize(NULL, NULL, interruptionListener, NULL);
  2. 实现interruptionListener

    void interruptionListener( void * inClientData, UInt32 inInterruptionState){
        if (inInterruptionState == kAudioSessionBeginInterruption)
        {
            NSLog(@"Begin kAudioSessionBeginInterruption");        
            alcMakeContextCurrent(NULL); // important
        }
        else if (inInterruptionState == kAudioSessionEndInterruption)
        {
            AVAudioSession * audioSession = [AVAudioSession sharedInstance];
            NSError * err = nil;
            [audioSession setCategory :AVAudioSessionCategoryPlayback error:&err];      // important
            if(err){
                NSLog(@"audioSession: %@ %ld %@", [err domain], (long)[err code], [[err userInfo] description]);
                return;
            }
            err = nil;
            [audioSession setActive:YES error:&err];
            if(err){
                NSLog(@"audioSession: %@ %ld %@", [err domain], (long)[err code], [[err userInfo] description]);
                return;
            }
    
            //AudioSessionSetActive(true); //sometimes have no effect
    
            // use alcMakeContextCurrent to set the  context——with the context you stored before   // important
            NSLog(@"End kAudioSessionEndInterruption");
        }
    }
    

    现在,当时钟或电话中断时,它可以播放,音乐可以播放。

  3. 但是,如果您接听电话并触摸“主屏幕”(尚未挂断),然后重新挂断电话,然后返回应用程序,则无法播放音乐,你应该这样做:
    当应用从背景转到前景时,请设置AVAudioSessioncontext。 (不只是在中断结束时设置它们)