2017-02-16 8 views
2

Ich versuche den Status der Taste je nach Anrufstatus zu ändern. Ich habe Code von hier verwendet, um Anrufstatus zu erkennen: How to get a call event using CTCallCenter:setCallEventHandler: that occurred while the app was suspended?iOS Wie kann ich den Anrufstatus im Hintergrund erkennen?

Und es funktioniert gut, wenn App im Vordergrund ist. Aber es funktioniert überhaupt nicht im Hintergrund. In der Dokumentation für CTCallCenter.callEventHandler:

Wenn Ihre Anwendung des aktiven Zustand wieder aufgenommen wird, es ein einziges Rufereignis für jeden Anruf erhält, die staatlich unabhängig davon verändert, wie viele staatlichen der Anruf ändert erfahren, während der Anwendung ausgesetzt wurde. Das Einzelanrufereignis, das an Ihren Handler gesendet wird, wenn Ihre Anwendung in den aktiven Zustand zurückkehrt, beschreibt den Status des Anrufs unter der Zeit.

Aber ich bekomme keine Anrufereignisse, wenn App wieder aktiv wird. Alles, was ich bekomme, ist der zuletzt gespeicherte Anrufstatus, wenn die App im Vordergrund war. Wie kann ich den Anrufstatus im Hintergrund erkennen?

Hier ist mein Code:

AppDelegate.swift

let callСenter = CTCallCenter() 

    func block (call:CTCall!) 
    { 
     callState = String(call.callState) 
     print(call.callState) 
    } 

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 
    { 
     //check for call state 
     callСenter.callEventHandler = block 

... 

     return true 
    } 

ViewController.swift

override func viewDidLoad() 
    { 
     super.viewDidLoad() 

     NotificationCenter.default.addObserver(
      self, 
      selector: #selector(cameBackFromSleep), 
      name: NSNotification.Name.UIApplicationDidBecomeActive, 
      object: nil 
     ) 

     ... 
    } 

    func cameBackFromSleep() 
    { 
     self.viewWillAppear(true) 
    } 

    override func viewWillAppear(_ animated: Bool) 
    { 
     switch callState 
     { 
     case "CTCallStateConnected": 
      print("callState: ", callState) 
      self.textLabel.isHidden = true 
      startBtnAnimation() 
     case "CTCallStateDisconnected": 
      print("callState: ", callState) 
      self.textLabel.center.y += self.view.bounds.height 
      self.textLabel.isHidden = false 
      stopBtnAnimation() 
     default: break 
     } 
    } 

Antwort

2

Schließlich löste ich es! Ich benutzte Code aus dieser Antwort: Find if user is in a call or not?

ich alles von AppDelegate entfernt, alle Job in ViewController getan wird:

override func viewDidLoad() 
    { 
     super.viewDidLoad() 

     NotificationCenter.default.addObserver(
      self, 
      selector: #selector(cameBackFromSleep), 
      name: NSNotification.Name.UIApplicationDidBecomeActive, 
      object: nil 
     ) 

... 

    } 

    private func isOnPhoneCall() -> Bool 
    { 
     let callCntr = CTCallCenter() 

     if let calls = callCntr.currentCalls 
     { 
      for call in calls 
      { 
       if call.callState == CTCallStateConnected || call.callState == CTCallStateDialing || call.callState == CTCallStateIncoming 
       { 
        print("In call") 
        return true 
       } 
      } 
     } 

     print("No calls") 
     return false 
    } 

    func cameBackFromSleep() 
    { 

     self.viewWillAppear(true) 
    } 

    override func viewWillAppear(_ animated: Bool) 
    { 
     print("is on call", isOnPhoneCall()) 
     switch isOnPhoneCall() 
     { 
     case true: 
      print("startBtnAnimation") 
      startBtnAnimation() 
      recordBtnIsPressed = true 
     case false: 
      print("stopBtnAnimation") 
      stopBtnAnimation() 
      recordBtnIsPressed = false 
     default: break 
     } 
    } 

Jetzt ist es funktioniert gut. Nicht sicher, warum CTCallCenter in AppDelegate so komisch funktioniert.

Verwandte Themen