2016-03-15 5 views
5

Я хотел попытаться обнаружить входящие телефонные звонки в моем приложении. Я создал новый проект Swift с нуля, чтобы попробовать какой-то код. Единственное, что я сделал импортировала CoreTelephony в ViewController, который создается с каждым новым проектом, и я также изменил viewDidLoad(), чтобы:Обнаружение телефонных звонков на iOS с CTCallCenter (Swift)

super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    let callCenter = CTCallCenter() 
    NSLog("start") 

    callCenter.callEventHandler = {[weak self] (call: CTCall) ->() in 

     self?.label.text = call.callState 
     NSLog("Call state") 
     NSLog(call.callState) 

    } 

Я также попытался без [слабой самости], так как я новичок в скор и не уверен, что это влечет за собой.

Когда я запускаю свое новое маленькое приложение через XCode на моем телефоне, ничего не происходит, когда звонок получен, отключен или что-то еще. Нет ошибки, что так когда-либо. Нужно ли мне что-то делать для использования инфраструктуры CoreTelephony и CTCallCenter?

С уважением Йохан

+1

Попробуйте сделать 'callCenter' свойство вашего контроллера вида вместо переменной в' viewDidLoad'. –

+0

Большое спасибо, что сработало !! –

+0

Можете ли вы объяснить, почему он работал с callCenter как свойство вместо переменной? –

ответ

1

Это расширение на мой комментарий выше.

Try делая callCenter это свойство вашего зрения контроллера вместо просто переменной в viewDidLoad.

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

В вашем случае вы определяете callCenter и присваиваете ему новый экземпляр CTCallCenter. Но в конце viewDidLoad экземпляр CTCallCenter больше не используется, поэтому он очищается от памяти. Поскольку он больше не существует, он не может обрабатывать события вызова.

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

Более подробно, читайте Automatic Reference Counting in Swift

11

callEventHandler устарела начиная IOS 10.

IOS 10 теперь использует новую основу для достижения того, что вы пытаетесь сделать, CallKit. Это новая инфраструктура Apple, которая должна обрабатывать все прерывания телефонного звонка. Для обнаружения входящих и исходящих вызовов вы используете CXCallObserver. Этот класс использует протокол CXCallObserverDelegate, чтобы сообщить зарегистрированному делегату об изменении вызовов. Я обнаружил, что он хорошо работает, установив AppDelegate в качестве делегата.

// AppDelegate 
var callObserver: CXCallObserver! 

// in applicationDidFinishLaunching... 
callObserver = CXCallObserver() 
callObserver.setDelegate(self, queue: nil) // nil queue means main thread 

extension AppDelegate: CXCallObserverDelegate { 
    func callObserver(_ callObserver: CXCallObserver, callChanged call: CXCall) { 
     if call.hasEnded == true { 
      print("Disconnected") 
     } 
     if call.isOutgoing == true && call.hasConnected == false { 
      print("Dialing") 
     } 
     if call.isOutgoing == false && call.hasConnected == false && call.hasEnded == false { 
      print("Incoming") 
     } 

     if call.hasConnected == true && call.hasEnded == false { 
      print("Connected") 
     } 
    } 
}