CTCallCenter в Swift

Я пытаюсь использовать CTCallCenter в Swift, однако всегда отображается ошибка.

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

У кого-нибудь есть идея решить эту проблему?

Вот мой код

import CoreTelephony

class ViewController: UIViewController{

    var callCenter:CTCallCenter = CTCallCenter()

    override func viewDidLoad() {

           callCenter.callEventHandler(call:CTCall) -> Void in{
                //will get CTcall status here
           }
    }
}

Есть три ошибки.

1. Блок операторов в фигурных скобках является неиспользуемым замыканием.

2, ожидаемое выражение

3, Последовательные операторы в строке должны быть разделены знаком ;.

Я пытался изменить, как указано, но все способы неверны.

Заранее спасибо!


person T.Akashi    schedule 22.10.2014    source источник
comment
Вы получаете ошибку, потому что вы объявляете это неправильно.   -  person Dharmesh Kheni    schedule 22.10.2014
comment
Да, я это понял, но на самом деле я не знал, как правильно вызывать callEventHandler, даже я видел ссылки. Вы знаете, как написать CTCall callEventHandler?   -  person T.Akashi    schedule 22.10.2014


Ответы (2)


У меня это работает, используя следующий код:

import CoreTelephony

class SomeClass: UIViewController {

    private var callCenter = CTCallCenter()

    override func viewDidLoad() {
        super.viewDidLoad()

        callCenter.callEventHandler = { (call:CTCall!) in

            switch call.callState {
                case CTCallStateConnected:
                    println("CTCallStateConnected")
                    self.callConnected()
                case CTCallStateDisconnected:
                    println("CTCallStateDisconnected")
                    self.callDisconnected()
                default:
                    //Not concerned with CTCallStateDialing or CTCallStateIncoming
                    break
            }
        }
    }

    func callConnected(){
        // Do something when call connects
    }

    func callDisconnected() {
        // Do something when call disconnects
    }
}

Надеюсь, поможет.

person Dylan    schedule 07.04.2015
comment
Извините, если я ошибаюсь, но я думаю, что это вызовет цикл удержания. Чтобы этого избежать, я бы написал: { [weak self] (call:CTCall!) in .... self?.callConnected() .... }. - person Ferran Maylinch; 05.04.2017

Из Apple:

Ответ на события сотового вызова

Отправляется при изменении состояния вызова.

Декларация:

var callEventHandler: ((CTCall!) -> Void)!

Обсуждение:

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

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

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

Вот более сложный пример. Предположим, что ваше приложение переходит из активного в приостановленное состояние после того, как пользователь инициировал вызов, но до того, как он соединится (то есть ваше приложение приостанавливается, пока вызов находится в состоянии набора номера). Предположим далее, что пока ваше приложение приостановлено, вызов сначала переходит в состояние «подключено», а затем в состояние «отключено». Когда ваше приложение возвращается в активное состояние, вы получаете одно событие сотового вызова, указывающее, что вызов отключен.

Может быть, теперь вы можете понять, как заявить об этом.

person Dharmesh Kheni    schedule 22.10.2014
comment
Могу я спросить больше? Это означает, что первая строка этого метода выглядит так? callEventHandler:{(instance:CTCall!)-›Void} Я пробовал несколько способов, но не смог найти правильный... - person T.Akashi; 22.10.2014
comment
Вы пробовали это? var callCenter: ((CTCall!) -> Void)! - person Dharmesh Kheni; 22.10.2014