Я добавил наблюдателя для уведомления об прерывании при записи звука.
Это прекрасно работает при выполнении исходящего вызова, входящего вызова и ответа не, Siri и т.д.
Теперь мое приложение работает в фоновом режиме с красной полосой в верхней части экрана, и продолжение записи в состояниях, описанных выше, не является проблемой.
Но когда я действительно отвечаю на входящий звонок. Я получаю еще одно уведомление AVAudioSessionInterruptionTypeBegan
, а затем, когда я останавливаю вызов, я никогда получаю сообщение AVAudioSessionInterruptionTypeEnded
.
Я попытался использовать CTCallCenter, чтобы определить, когда был запущен вызов, но я не могу перезапустить запись из этого обратного вызова.
Кто-нибудь знает, как заставить механизм прерывания работать с входящим вызовом, на который на самом деле получают ответ?
Это (часть) кода, который я использую;
CFNotificationCenterAddObserver(
CFNotificationCenterGetLocalCenter(),
this,
&handle_interrupt,
(__bridge CFStringRef) AVAudioSessionInterruptionNotification,
NULL,
CFNotificationSuspensionBehaviorDeliverImmediately );
...
static void handle_interrupt( CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo )
{
au_recorder *recorder = static_cast<au_recorder*>( observer );
NSNumber* interruptionType = [( ( __bridge NSDictionary* ) userInfo ) objectForKey:AVAudioSessionInterruptionTypeKey];
switch ( [interruptionType unsignedIntegerValue] )
{
case AVAudioSessionInterruptionTypeBegan:
{
// pause recorder without stopping recording (already done by OS)
recorder->pause();
break;
}
case AVAudioSessionInterruptionTypeEnded:
{
NSNumber* interruptionOption = [( ( __bridge NSDictionary* ) userInfo ) objectForKey:AVAudioSessionInterruptionOptionKey];
if ( interruptionOption.unsignedIntegerValue == AVAudioSessionInterruptionOptionShouldResume )
{
recorder->resume();
}
break;
}
}
}
Я попытался связать уведомление с AppDelegate, UIViewController и отдельным классом, но это не помогает.
Edit
Это то, что я пытался использовать CTCallCenter, но это очень шелушащийся. Когда вызов recorder->resume()
вызывается из обратного вызова, он либо работает, либо сильно сбой, либо ничего не делает, пока приложение не будет снова возвращено на передний план вручную.
callCenter = [[CTCallCenter alloc] init];
callCenter.callEventHandler = ^(CTCall *call)
{
if ([call.callState isEqualToString:CTCallStateDisconnected])
{
recorder->resume();
}
};