2017-02-16 3 views
2

Я пытаюсь изменить состояние кнопки в зависимости от состояния вызова. Я использовал код отсюда, чтобы определить состояние звонка: How to get a call event using CTCallCenter:setCallEventHandler: that occurred while the app was suspended?iOS Как определить состояние вызова в фоновом режиме?

И он отлично работает, когда приложение находится на переднем плане. Но это совсем не работает в фоновом режиме. В документации по CTCallCenter.callEventHandler:

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

Но я не получаю никаких событий вызова, когда приложение возобновляется. Все, что я получаю, это последнее сохраненное состояние вызова, когда приложение находилось на переднем плане. Как определить состояние вызова в фоновом режиме?

Вот мой код:

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 
     } 
    } 

ответ

2

Наконец, я решил его! Я использовал код из этого ответа: Find if user is in a call or not?

Я удалил все от AppDelegate, вся работа выполняется в ViewController:

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 
     } 
    } 

Сейчас он работает отлично. Не знаю, почему CTCallCenter работает так странно в AppDelegate.