2015-09-15 2 views
0

Я разрабатываю VoIP-приложение, которое использует Twilio для телефонии. Проблема, с которой я столкнулся, заключается в том, что если AVAudioSession прерывается во время разговора, например, входящим вызовом FaceTime, то я не могу продолжать использовать сессию аудио после окончания прерывания. Вызов не отключается, но звук не слышен, и микрофон тоже ничего не записывает.Возобновление вызова twilio после прерывания сеанса аудиосвязи

Я зарегистрировался для AVAudioSessionInterruptionNotification и в обработчике уведомлений, я делаю следующее:

// get the user info dictionary 
NSDictionary *interuptionDict = notification.userInfo; 
// get the AVAudioSessionInterruptionTypeKey enum from the dictionary 
NSInteger interuptionType  = [[interuptionDict valueForKey:AVAudioSessionInterruptionTypeKey] integerValue]; 
// decide what to do based on interruption type here... 
switch (interuptionType) 
{ 
    case AVAudioSessionInterruptionTypeBegan: 

     DLog(@"Audio Session Interruption case started."); 
     [self setAudioSessionActive:NO]; 
     break; 

    case AVAudioSessionInterruptionTypeEnded: 
    { 
     DLog(@"Audio Session Interruption case ended."); 
     [self setAudioSessionActive:YES]; 
     break; 
    } 
    default: 
     DLog(@"Audio Session Interruption Notification case default."); 
     break; 
} 

// Activate or deactivate the app's audio session 
- (void)setAudioSessionActive:(BOOL)active 
{ 
BOOL success = NO; 
NSError *error = nil; 
success = [[AVAudioSession sharedInstance] setActive:active error:&error]; 
if (error) 
{ 
    DLog(@"Error setting audio session : %@", [error description]); 
} 
else if (success) 
{ 
    DLog(@"Audio session state set successfully :") 
} 
} 

Я не получаю никаких ошибок, но текущий вызов просто не работает.

Я прочитал руководство по программированию аудио-сессии, руководство по человеческому интерфейсу для аудио и других документов, связанных со звуком. Я верю, что следую правильным шагам. Просьба дать какие-либо предложения в качестве того, что мне здесь не хватает.

+0

Когда вы отлаживаете эту проблему, какой DLOG-оператор вы получаете? – TommyBs

+0

Он записывает «Состояние сеанса аудио успешно установлено:» everytime – humblePilgrim

ответ

0

Я вне сети Twilio Developer Network. Из вашего сообщения неясно, вызываются ли уведомления всякий раз, когда происходит событие прерывания. Независимо от того, вам нужно будет зарегистрировать свой аудио-сеанс singleton для 2 наборов уведомлений. Вы в настоящее время зарегистрированы только для одного уведомления.

Первое изменение это

// get the user info dictionary 
NSDictionary *interuptionDict = notification.userInfo; 
// get the AVAudioSessionInterruptionTypeKey enum from the dictionary 
NSInteger interuptionType  = [[interuptionDict valueForKey:AVAudioSessionInterruptionTypeKey] integerValue]; 

к этому

NSNumber *interruptionType = [notification.userInfo objectForKey:AVAudioSessionInterruptionTypeKey]; 
    NSNumber *interruptionOption = [notification.userInfo objectForKey:AVAudioSessionInterruptionOptionKey]; 

Далее, вы хотите использовать API Кво зарегистрировать для обоих наборов уведомлений.

Извещение 1 (У вас есть это): AVAudioSessionInterruptionNotification

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(handleAudioSessionInterruption:) 
              name:AVAudioSessionInterruptionNotification 
              object:aSession]; 

Уведомление 2 (Добавить это): AVAudioSessionMediaServicesWereResetNotification

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(handleMediaServicesReset) 
              name:AVAudioSessionMediaServicesWereResetNotification 
              object:aSession]; 

Система может либо приостановить активную звуковую сессию или освободить его в зависимости от того, или вы не отвечаете или не отклоняете входящий звонок. Эти 2 уведомления заботятся обо всех сценариях. См. Ссылку this для получения дополнительной информации о AVAudioSessionMediaServicesWereResetNotification

Вам также не нужно устанавливать сессию аудио в неактивную, если уведомление происходит, система делает это за вас. Когда приходит вызов, приложение перемещается в фоновый режим. Когда он вернется, вы должны разрешить 1-2 секунды, прежде чем возобновить аудиосессию для обеспечения безопасности потоков. Так что ваш переключатель оператор должен выглядеть следующим образом

switch (interruptionType.unsignedIntegerValue) { 
      case AVAudioSessionInterruptionTypeBegan:{ 
       // • Your session is already inactive, you can update the UI if necessary 
      } break; 
      case AVAudioSessionInterruptionTypeEnded:{ 

       if (interruptionOption.unsignedIntegerValue == AVAudioSessionInterruptionOptionShouldResume) { 
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1), dispatch_get_main_queue(), ^{ 
        // • Update the session here 
        [self setAudioSessionActive:YES]; 

       }); 
       } 
      } break; 
      default: 
       break; 
     } 

Наконец, в методе, называемом для второго уведомления, убедитесь, что для сброса аудио сессии активным.

- (void)handleMediaServicesReset { 
     [self setAudioSessionActive:YES]; 
} 

Надеюсь, что это поможет! Дайте мне знать, если у вас есть еще вопросы.

+0

Привет, sraval, я пробовал сценарий после внесения изменений в код в соответствии с вашим предложением. Но та же проблема сохраняется. – humblePilgrim

+0

Mithun, ваши уведомления вызываются при поступлении звонка? Другими словами, вы видите, что началось «Событие прерывания аудиозаписей». в вашей консоли всякий раз, когда приходит вызов? – sraval

+0

Привет, sraval, да, всякий раз, когда приходит вызов FaceTime, и приложение переходит на задний план, уведомление о прерывании аудио сеанса принимается. Аналогично, когда прерывание заканчивается, получено уведомление. Следовательно, я пытаюсь установить активный сеанс, и это также возвращает успех. Но нет звука в или из – humblePilgrim

Смежные вопросы