Programming/iOS

📲 CallKit - How To Detect Call State & Why not working CXCallObserverDelegate at a Device?

devssun 2020. 9. 3. 23:38
728x90
반응형

Q1. How To Detect Call State

프로젝트에서 통화 상태를 감지해 통화가 들어왔을 때 (Incoming Call) 예외처리를 추가하기로 했다.

일단 통화 관련 코드를 사용하기 위해선 CallKit 프레임워크를 import 해야한다.

CallKit

CallKit은 iOS 10부터 지원되며 애플에서 기존에 없던 통화 제어 부분을 지원하면서 추가된 프레임워크다. 이걸 사용하면 통화 화면을 제어할 수 있다!

하지만 나는 후스콜 같은 스팸 차단 서비스가 아닌 폰에 전화가 왔냐 / 안왔냐 / 내가 걸었냐 등을 판단하기 위해 사용해보려고 한다.

https://media.giphy.com/media/BgU5mPxgj9NeM/giphy.gif

CXCall

CallKit에서 판단할 수 있는 전화 상태는 총 4가지다. 하지만 CXCall 개체를 직접 인스턴스화하지 않고 대신 수신 전화를 받거나 발신 전화가 시작되면 전화 통신 공급자가 CXCall 개체를 만들게 된다.

근데 아래 상태를 보면 isOutgoing 는 있지만 isIncoming 은 없다.

→ isOutgoing을 반대로 하면 수신이라고 할 수 있다. (걸기의 반대는 수신)

@available(iOS 10.0, *)
open class CXCall : NSObject {


    open var uuid: UUID { get }


    open var isOutgoing: Bool { get }

    open var isOnHold: Bool { get }

    open var hasConnected: Bool { get }

    open var hasEnded: Bool { get }
}

그럼 통화 상태는 어떻게 가져오느냐? 바로 CXCallObserverDelegate 에서 가져올 수 있다.

func callObserver(_ callObserver: CXCallObserver, callChanged call: CXCall) {
        if call.hasEnded {
            print("hasEnded")
        } else if call.hasConnected {
            print("hasConnected")
        } else if call.isOnHold {
            print("isOnHold")
        } else if call.isOutgoing {
            print("isOutgoing")
        }
    }

Full Source code

아래 처럼 코드를 짜면 현재 통화 상태를 알 수 있다.

import UIKit
import CallKit

class ViewController: UIViewController {

    let callObserver = CXCallObserver()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        callObserver.setDelegate(self, queue: nil)

    }
}

extension ViewController: CXCallObserverDelegate {
    func callObserver(_ callObserver: CXCallObserver, callChanged call: CXCall) {
        if call.hasEnded {
            print("hasEnded")
        } else if call.hasConnected {
            print("hasConnected")
        } else if call.isOnHold {
            print("isOnHold")
        } else if call.isOutgoing {
            print("isOutgoing")
        }
    }
}

Q2. Why not working CXCallObserverDelegate at a Device?

iOS 14에서 전화 수신 테스트를 하다가 내가 해둔 전화 예외 처리가 안먹히는 것을 확인했다. 근데 .. 되던 폰에서도 안되서 멘붕에 빠졌다.

https://media.giphy.com/media/dsWl87hIgGsnjrqgyB/giphy.gif

iOS 14에서 CallKit API가 바뀐 것도 아닌데 아무리 찾아봐도 안나온다.

열심히 찾다가 유심이 있는 테스트 폰으로 했다.

잘 된 다

하마터면 삽질할 뻔 했다.

결론 : CallKit을 테스트하려면 유심이 장착된 폰에서 해야한다.

(To test CallKit, you have to do it on a phone with a SIM.)

https://media.giphy.com/media/yoJC2GnSClbPOkV0eA/giphy.gif

두개의 질문을 해결했다.

반응형