[iOS] CallKit Framework이란

2020. 1. 8. 22:03iOS

CallKit Framework

앱의 VoIP 서비스를 위한 시스템 호출 UI를 표시하고 다른 앱 및 시스템과 함께 통화 서비스를 조정합니다.

 

시스템상 다른 통화관련 앱들과 통합하게 해줍니다. 통화 인터페이스를 제공하며, VoIP서비스와 back-end의 소통을 다룹니다.

통화 수신, 발신시 폰앱과 같은 인터페이스가 표시되어 좀더 네이티브한 느낌을 줍니다.

방해금지와 같은 시스템레벨 동작에 적합한 응답을합니다.

통화 처리 외에도 발신자 ID 정보와 서비스와 관련된 차단된 번호 목록을 제공하기 위해 통화 디렉토리 앱 확장을 제공할 수 있습니다.

 

걸려온 전화 받기

  1. 들어오는 전화를 수신하도록 앱을 구성하려면 먼저 CXProvider 객체를 생성하여 글로벌 액세스를 위해 저장
  2. 앱은 PushKit에 의해 생성된 VoIP 푸시 알림과 같은 외부 알림에 응답하여 프로바이더에게 수신 호출을 알림
  3. 외부 알림에 의해 제공된 정보사용해서 통화와 발신자의 식별을위한 유니크한 UUID, CXCallUpdate객체 생성하고
  4. 프로바이더에게 reportNewIncomingCall(with:update:completion:)메소드를 사용하여 두 객체를 전달한다
  5. 통화 연걸된 후, 시스템은 프로바이더 델리게이트의 provider(_:perform:)메소드를 호출한다
  6. 구현:  Configuring AVAudiosession, fulfill()호출

 

발신 만들기 방법3가지 

  1. 앱내에서 상호작용
  2. 지원된 커스텀 URL scheme 링크열기
  3. Siri를 이용한 VoIP개시

 

앱내에서 상호작용

  1. 발신을 만들기위해 앱의 CXCallController객체에 CXStartCallAction 객체를 전달하여 요청작성
  2. Action은 식별위한 유니크한 UUID, CXHandle로 구성한다.
  3. 수신자가 전화를 받은 후, 시스템은 프로바이더 델리게이트에 provider(_:perform:)메소드를 호출한다.
  4. 구현: Configuring AVAudiosession, fulfill()호출

 

전화제한과 식별

발신자의 전화번호를 식별하고, 막아주는 Call Directory생성이 가능하다.

CXCallDirectoryPhoneNumber 형식을 이용하며, 국가 코드가 구성되어있다(아라비아 숫자 순서대로 예: 미국 1 한국 82)

 

Call Directory App Extension 만들기

프로젝트에 새 타겟 Call Directory Extension탬플릿 선택하여 추가(CXCallDirectoryProvider클래스를 상속받은 클래스가 생성됨) - CallDirectoryHandler라는 클래스를 생성하였음.

beginRequest(with:)메소드에 식별, 수신차단 설정구현 -> 앱이 extension될때 이 메소드가 호출된다.(뭔말?-App Extension Programming Guide참조할것)

 

발신자 식별하기

폰이 들어오는 전화를 수신했을때 시스템이 첫번째로 유저번호를 매칭한다.

매칭결과 없을때  앱의 CallDirectory의 식별된 번호를 매칭한다.

이는 소셜 네트워크와 같은 시스템 연락처와 별개인 사용자에 대한 연락처 목록을 유지하거나 고객 서비스 지원 또는 배달 통지와 같이 앱 내에서 시작될 수 있는 수신 호를 식별하는 애플리케이션에 유용하다

 

예를들어 소셜네트워크앱에서 친구이지만 연락처는 갖고있지않다. 소셜네트워크앱이 유저의 모든 친구들의 번호를 추가하거나 다운로드한 CallDirectory를 갖고있다. 

이때문에 “알려지지 않은 발신자” 대신 “( 앱 이름 ) 발신자 : GSThecar”라고 표시한다.

 

수신자들의 정보 식별을 제공하기위해 addIdentificationEntry(withNextSequentialPhoneNumber:label:) 메소드를 사용하여 beginRequest(with:)에 구현해준다.

이 방법은 시스템이 각 개별 호출이 아닌 앱 확장을 시작할 때만 호출되기 때문에, 한 번에 통화 식별 정보를 지정해야 한다. 예를 들어, 수신 호출에 대한 정보를 찾기 위해 웹 서비스에 요청할 수 없다.

 

전화제한

폰이 들어오는 전화를 수신했을때 시스템이 첫번째로 유저의 Block List를 확인해서 Block되었는지 확인한다.

유저의 리스트에 없고, 시스템 리스트에 없으면 앱의 Call Directory에서 확인한다.

이는 이미 알려진 텔레마케터(ARS)나, 스팸번호들에 대한 대응으로 유용하다.

 

Blocking하기위해서 addBlockingEntry(withNextSequentialPhoneNumber:)메소드를 사용하여 beginRequest(with:)에 구현하면된다.

 

튜토리얼을 진행하며 하기의 프레임워크 클래스  프로토콜을 더 알아봐야겠다.

(PushKit, PKPushRegistryDelegate, CXProvider, CXProviderDelegate, UUID, CXCallUpdate, CXCallController, CXStartCallAction, CXHandle, AVFoundation, AVAudioSession, CXCallDirectoryPhoneNumber, CXCallDirectoryProvider  )

'iOS' 카테고리의 다른 글

[iOS] App States  (0) 2020.02.04
[iOS] Core Location Framework  (0) 2020.02.02
[iOS] NCWidgetProviding Protocol  (0) 2020.01.16
[iOS] PushKit Framework  (0) 2020.01.11
[iOS] WKWebView사용하기  (0) 2020.01.05