2016-03-15 3 views
5

Ich wollte versuchen, eingehende Anrufe in meiner App zu erkennen. Ich habe ein neues Swift-Projekt von Grund auf neu erstellt, um Code zu testen. Das einzige, was ich tat, war der Import CoreTelephony in dem Viewcontroller, die mit jedem neuen Projekt angelegt wird, und ich änderte auch den viewDidLoad() auf:Erkennen von Telefonanrufen auf iOS mit 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) 

    } 

Ich habe auch versucht, ohne die [schwache Selbst], da ich bin neu in swift und nicht sicher, was es beinhaltet.

Wenn ich meine neue kleine App über XCode auf meinem Handy starte, passiert nichts, wenn ein Anruf empfangen wird, die Verbindung getrennt wird oder irgendetwas anderes. Kein Fehler was auch immer. Muss ich etwas mehr tun, um das CoreTelephony-Framework und das CTCallCenter zu verwenden?

Grüße Johan

+1

Versuchen Sie, 'callCenter' eine Eigenschaft Ihres View-Controllers anstatt nur einer Variablen in' viewDidLoad' zu machen. –

+0

Vielen Dank, das hat funktioniert !! –

+0

Können Sie erklären, warum es mit CallCenter als Eigenschaft statt einer Variablen gearbeitet hat? –

Antwort

1

Dies ist eine Erweiterung auf meinen Kommentar oben.

Try callCenter eine Eigenschaft Ihres View-Controller zu machen, anstatt nur eine Variable in viewDidLoad.

Wenn Sie eine Variable in einer Methode definieren, ist die Variable und ihr Wert nur innerhalb dieser Methode vorhanden. Wenn die Methode beendet ist, werden die Werte und ihre Werte bereinigt, sodass sie keinen Speicher mehr verwenden (sofern der Wert nicht anderweitig verwendet wird).

In Ihrem Fall definieren Sie callCenter und weisen ihm eine neue CTCallCenter Instanz zu. Aber am Ende der viewDidLoad wird die CTCallCenter Instanz nicht mehr verwendet, so dass es aus dem Speicher aufräumt. Da es nicht mehr existiert, kann es die Anrufereignisse nicht verarbeiten.

Durch Hinzufügen von callCenter als eine Eigenschaft Ihres View-Controllers wird die Lebensdauer der CTCallCenter-Instanz an die Lebensdauer Ihres View-Controllers gebunden. So wird die CTCallCenter nur aus dem Speicher bereinigt, wenn der View-Controller aus dem Speicher bereinigt wird.

Für weitere Details lesen Automatic Reference Counting in Swift

11

callEventHandler ist veraltet iOS 10.

iOS 10 jetzt beschäftigt, einen neuen Rahmen beginnen zu erreichen, was Sie zu tun versuchen, CallKit. Dies ist Apples neues Framework, das alle Unterbrechungen von Telefonanrufen behandeln soll. Um eingehende und ausgehende Anrufe zu erkennen, verwenden Sie die CXCallObserver. Diese Klasse verwendet ein Protokoll CXCallObserverDelegate, um einen registrierten Delegierten über eine Änderung von Anrufen zu informieren. Ich habe gefunden, dass es gut funktioniert, AppDelegate als der Delegierte setzend.

// 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") 
     } 
    } 
}