Определение состояния звонка в iOS4

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

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

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

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

Спасибо.


person Michael Kessler    schedule 23.07.2010    source источник
comment
Вы имеете в виду телефонный звонок в другом приложении? Как при звонке в Skype в фоновом режиме?   -  person progrmr    schedule 23.07.2010
comment
См. stackoverflow.com/questions/3319805/   -  person Nikolay Mamaev    schedule 15.06.2012


Ответы (2)


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

Например:

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

РЕДАКТИРОВАТЬ: перечитывая свой вопрос, вы хотите, чтобы эти события были приостановлены, верно? Я не думаю, что это возможно.

Из документы:

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

person Don    schedule 23.07.2010
comment
Спасибо. Похоже, Core Telephony может послужить моей цели. Вы знаете, могу ли я вывести свое приложение на передний план из фона? - person Michael Kessler; 23.07.2010
comment
Нет, вы не можете выйти на передний план самостоятельно. И вы будете ограничены в том, какие события вы получите. Лучшее, что вы можете сделать, - это прислушаться к уведомлениям о переходе между состояниями и соответствующим образом обработать все. Ср. developer.apple.com/iphone/library/ документация / iphone / - person Don; 24.07.2010
comment
Спасибо. Я застрял в нескольких проектах iOS3, и у меня нет времени изучать все нововведения iOS4 ... - person Michael Kessler; 26.07.2010

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

person progrmr    schedule 23.07.2010
comment
Спасибо. Кстати, означает ли это, что я не могу воспроизводить звуки / музыку во время телефонного звонка? Даже если мое приложение находится на переднем плане (а приложение для телефона находится в фоновом режиме)? - person Michael Kessler; 23.07.2010
comment
У меня возникла проблема с тем, что мое приложение (в фоновом режиме) воспроизводило звуки во время телефонного звонка. Я использовал обратные вызовы AVAudioSessionDelegate, чтобы отслеживать, был ли он прерван, и в случае прерывания приложение перестает воспроизводить звуки. - person progrmr; 24.07.2010