2016-03-15 13 views
5

Volevo provare a rilevare le chiamate in arrivo nella mia app. Ho creato un nuovo progetto Swift da zero solo per provare un po 'di codice. L'unica cosa che ho fatto è stata importando CoreTelephony nel ViewController che viene creato con ogni nuovo progetto e ho anche cambiato il viewDidLoad() a:Rileva le chiamate telefoniche su iOS con 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) 

    } 

Ho provato anche senza la [sé debole] da quando io sono nuovo di rapida e non sono sicuro di ciò che comporta.

Quando eseguo la mia nuova piccola app tramite XCode sul mio telefono, nulla accade quando una chiamata viene ricevuta, scollegata o altro. Nessun errore come mai. Devo fare qualcosa di più per usare il framework CoreTelephony e CTCallCenter?

saluti Johan

+1

Provare a rendere 'callCenter' una proprietà del proprio controller di visualizzazione anziché solo una variabile in' viewDidLoad'. –

+0

Grazie mille, ha funzionato !! –

+0

Puoi spiegare perché ha funzionato con callCenter come proprietà anziché come variabile? –

risposta

1

Si tratta di un'estensione sul mio commento di cui sopra.

provare a fare callCenter una proprietà della visualizzazione di controllo invece di una variabile in viewDidLoad.

Quando si definisce una variabile in un metodo, la variabile e il suo valore sono presenti solo all'interno di tale metodo. Quando il metodo è finito, il valore e i relativi valori vengono ripuliti in modo che non continuino a utilizzare la memoria (a meno che il valore non venga utilizzato altrove).

Nel tuo caso, definisci callCenter e assegna una nuova istanza CTCallCenter. Ma alla fine di viewDidLoad, l'istanza CTCallCenter non viene più utilizzata, quindi viene eliminata dalla memoria. Dal momento che non esiste più, non può gestire gli eventi di chiamata.

Aggiungendo callCenter come proprietà del controller di visualizzazione, si lega la durata dell'istanza CTCallCenter alla durata del controller di visualizzazione. Pertanto, lo CTCallCenter verrà cancellato dalla memoria solo quando il controller della vista verrà ripulito dalla memoria.

Per ulteriori dettagli, leggere Automatic Reference Counting in Swift

11

callEventHandler è stato deprecato a partire iOS 10.

iOS 10 oggi impiega un nuovo quadro per realizzare ciò che si sta cercando di fare, CallKit. Questo è il nuovo framework di Apple che dovrebbe gestire tutte le interruzioni delle chiamate telefoniche. Per rilevare le chiamate in entrata e in uscita, utilizzare lo CXCallObserver. Questa classe utilizza un protocollo CXCallObserverDelegate per informare un delegato registrato di una modifica delle chiamate. Ho trovato che funziona bene impostando come delegato il 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") 
     } 
    } 
} 
Problemi correlati