iOS Как узнать, звонит ли в данный момент по телефону

Я огляделся и все, что могу найти, - это проверить callState CTCallCenter. Однако это работает путем прослушивания события, которое в зависимости от того, активно ли приложение / приостановлено / возобновлено, событие может возникать в разное время.

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

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

Это вообще возможно?


person friend    schedule 08.06.2012    source источник


Ответы (4)


Объект CTCallCenter имеет свойство currentCalls, которое является NSSet текущими вызовами. Если есть вызов, то свойство currentCalls должно быть! = Nil.

Если вы хотите узнать, действительно ли подключен какой-либо из вызовов, вам придется перебрать текущие вызовы и проверить callState, чтобы определить, является ли он CTCallStateConnected или нет.

person ThomasW    schedule 08.06.2012
comment
круто ... как раз то, что мне нужно, спасибо. Если вы думаете, что этот вопрос помогает, пожалуйста, проголосуйте за него. - person friend; 08.06.2012
comment
ты спас мне жизнь - person tatiana_c; 25.09.2016
comment
Этот API устарел с iOS 9 или 10 .. - person Yonathan Goriachnick; 26.05.2021

Спасибо за ответ ThomasW. Думал тоже выложу код.

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    CTCallCenter *ctCallCenter = [[CTCallCenter alloc] init];
    if (ctCallCenter.currentCalls != nil) 
    {
        NSArray* currentCalls = [ctCallCenter.currentCalls allObjects];
        for (CTCall *call in currentCalls)
        {   
            if(call.callState == CTCallStateConnected)
            {
                // connected
            }
        }
    }
}
person friend    schedule 08.06.2012
comment
Вы можете значительно сократить этот код, используя быстрое перечисление: for (CTCall *call in ctCallCenter.currentCalls) {...}. Вам не нужно проверять nil или преобразовывать набор в массив. - person omz; 08.06.2012
comment
не могли бы вы предложить свой код, тогда омз? Я был бы более чем счастлив проголосовать за ваш ответ, если он будет просто постом бонга и будет намного более эффективным и действенным ... Ура, омз. - person Pavan; 09.08.2012
comment
именно то, что мне нужно! проголосовали! @AlBeebe: currentCalls используется в следующей строке. - person rockstarberlin; 29.03.2013

У меня была та же проблема, но я думаю, что правильный способ сделать это в iOS 10:

func checkForActiveCall() -> Bool {
    for call in CXCallObserver().calls {
        if call.hasEnded == false {
            return true
        }
    }
    return false
}
person JPetric    schedule 12.11.2019
comment
почему я всегда получаю hasEnded = false при закрытии приложения? - person famfamfam; 05.04.2021
comment
даже закрыл последний звонок, дважды щелкните по дому и не увидите здесь системы звонков - person famfamfam; 05.04.2021
comment
Работает с iOS 14 и 13. Это правильный ответ, поскольку CTCallCenter в настоящее время является устаревшим API. - person Yonathan Goriachnick; 27.05.2021

person    schedule
comment
Похоже, что это не работает при сборке в Xcode 7 для iOS 9.x - person Beltalowda; 08.06.2016