Обнаружение состояния вызова в iOS4

Я хотел бы знать, есть ли возможность определить, находится ли пользователь в вызове из приложения, которое в настоящее время находится в фоновом режиме.

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

Или даже более того - есть ли возможность определить, какое приложение находится на переднем плане?
Я не верю, что это возможно, но мне пришлось попробовать...; -)

Любая информация будет оценена.

Спасибо.

Ответ 1

В CTCallCenter существует метод callEventHandler, который вы можете передать блоку, который будет вызван при возникновении событий вызова. В этом блоке вы передадите объект CTCall и можете получить callState. Таким образом, вы можете получать уведомление, когда вызов инициируется или заканчивается, и обрабатывать его соответствующим образом. Вы не можете получить, какое приложение инициировало вызов, но если вы установили ivar при выполнении вызова, вы можете сказать, что это приложение, которое совершило звонок.

Например:

CTCallCenter *callCenter = [[CTCallCenter alloc] init];
callCenter.callEventHandler=^(CTCall* call){
    if (call.callState == CTCallStateDisconnected)
    { 
        //handle disconnect
    }
};

EDIT: перечитав свой вопрос, вы хотите, чтобы эти события были приостановлены, правильно? Я не думаю, что это возможно.

Из docs:

Если ваше приложение активно, когда происходит событие вызова, система отправляет событие в ваш обработчик немедленно. Однако события вызова также могут иметь место, пока приложение приостановлено. Пока он приостановлен, ваше приложение не принимает события вызова. Когда ваше приложение возобновляет активное состояние, оно получает одно событие вызова для каждого вызова, который изменил состояние, независимо от того, сколько состояний изменило вызов, когда ваше приложение было приостановлено. Событие одиночного вызова, отправленное вашему обработчику, после вашего приложения, возвращающегося в активное состояние, описывает состояние вызовов в это время.

Ответ 2

Если вы работаете в фоновом режиме и имеет AVAudioSession, вы получите обратные вызовы AVAudioSessionDelegate, сообщающие вам, что ваш AVAudioSession был прерван при получении телефонного звонка. AFAIK, что вся информация, которую вы получаете.