2010-09-16 3 views
1

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

CTCallCenter *callCenter = [[CTCallCenter alloc] init]; 

callCenter.callEventHandler=^(CTCall* call) 
{ 

    if (call.callState == CTCallStateDisconnected) 
{ 

    NSLog(@"Call has been disconnected"); 

    } 

    else if (call.callState == CTCallStateConnected) 
    { 

NSLog(@"Call has just been connected"); 

    } 

else if(call.callState == CTCallStateConnected) 
    { 

    NSLog(@"Call is incoming"); 

    } 

    else 
    { 

    NSLog(@"None of the conditions"); 

    } 

}; 

Теперь это работает отлично, когда, скажем, вызов принимается пользователем, когда приложение открыто. После отключения вызова приложение автоматически возвращается на передний план и правильно определяет, что состояние вызова отключено.

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

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

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

Можно ли пролить свет на то, почему это происходит? Любая помощь приветствуется. Благодарю.

+0

Если вы хотите отслеживать звонки в фоновом режиме, лучше всего использовать фоновое приложение (например, зарегистрироваться для фонового режима, «местоположение») и периодически проверять «callCenter.currentCalls». Проверьте мой ответ здесь для получения более подробной информации: http://stackoverflow.com/questions/10102108/ctcallcenter-call-event-handler-in-background-state/39230753#39230753. – nverinaud

ответ

3

Натан, вы воссоздаете экземпляр CTCallCenter каждый раз, когда приложение приходит на задний план? , если да, то это может быть проблемой.

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