2017-02-16 10 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.