콜킷의 기능에는 여러가지가 있습니다.

여러 스팸차단앱에서 제공하는 정보제공의 기능도 있고, 카카오톡의 보이스톡이나 페이스톡처럼 앱을 이용해 전화가 걸려올 때, 일반 전화 수신화면처럼 표시해주는 기능도 있습니다.


애플의 개발자 사이트에는 후자의 voip 샘플은 제공하지만, 정보표시 기능에 대한 샘플은 찾아 볼 수가 없더군요 ㅠ

심지어 콜킷 등장 후 약 반년간 콜킷 레퍼런스는 그저 빈 문서 ㅋㅋㅋ

애플에서는 이런 정보들을 더 잘 제공해주면 좋겠습니다...





전화 수신 시, 정보를 표시하는 방식은 간단합니다.


ios 내에 정보를 저장하는 디렉토리가 있습니다(편의상 Call Directory 라고 하겠습니다). 앱 내에서 익스텐션(Call Directory Extension)으로 디렉토리를 추가하고, 호스트 앱에서 익스텐션을 호출하는 방식으로 동작합니다. 저장할 번호가 변동이 없다면, Call Directory Extension 내에서 번호를 상수로 입력해버리면 간단합니다만...ㅎㅎ


만약에, 표시해 줄 정보에 변동이 있다면, 호스트 앱에서 새로운 정보를 익스텐션에서도 공유할 수 있는 저장소(ex. DB, 코어데이터)에 담은 후, 익스텐션을 호출하고, 익스텐션 내에서 저장소에 접근해 정보를 불러오는 방식이어야 합니다.


익스텐션 간에 공유가 가능한 저장소 사용법은 많이들 아실 거라 믿고, Call Directory Extension 사용법만 쓰도록 하겠습니다.







가장 먼저 할 것은, 당연하지만, 새 프로젝트를 만들고 익스텐션을 추가합니다.


우리가 추가할 익스텐션은 위에서도 언급한 Call Directory Extension 입니다.






추가하면 아래와 같은 소스를 볼 수 있습니다.







가장 위에 있는 beginRequest 메소드 안에,

addBlockingPhoneNumbers

addIdentificationPhoneNumbers

두 가지를 실행하는 것을 볼 수 있습니다.


말 그대로, addBlockingPhoneNumbers 는, 번호를 차단하는 메소드고,

addIdentificationPhoneNumbers 는, 번호에 정보를 담는 메소드입니다.




두 메소드의 동작방식이 비슷하기 때문에

addIdentificationPhoneNumbers 사용법만 쓰겠습니다.


addBlockingPhoneNumbers 에는

소스에 나온 바와 같이, 번호만 쑥쑥 담아주면 됩니다.

담은 번호는 전혀 전화가 오지 않습니다 ㅋㅋㅋ





    override func beginRequest(with context: CXCallDirectoryExtensionContext) {

        context.delegate = self


        do {

            try addIdentificationPhoneNumbers(to: context)

        } catch {

            NSLog("Unable to add identification phone numbers")

            let error = NSError(domain: "CallDirectoryHandler", code: 2, userInfo: nil)

            context.cancelRequest(withError: error)

            return

        }


        context.completeRequest()

    }

    

    private func addIdentificationPhoneNumbers(to context: CXCallDirectoryExtensionContext) throws {

        let phoneNumbers: [CXCallDirectoryPhoneNumber] = [ 82120, 82215889999]

        let labels = [ "국민은행 대표번호", "서울 다산콜센터" ]

        

        for (phoneNumber, label) in zip(phoneNumbers, labels) {

            context.addIdentificationEntry(withNextSequentialPhoneNumber: phoneNumber, label: label)

        }

    }



전화번호를 배열의 형태로 담아주고, 전화번호의 순서와 똑같이, 표시할 정보도 담아주면 됩니다.


여기서 주의할 점은,


1. 전화번호에 국가코드를 붙여야 한다는 것과,

2. 전화번호는 반드시 숫자 타입의 오름차순이어야 한다는 것 입니다.



아니면 에러 나요...ㅋㅋㅋ





다음은, 익스텐션을 호출할 메소드를 만들겠습니다.

간단하게 뷰 컨트롤러에 버튼 하나 추가했습니다.






스크린샷에는 없지만, 결과를 확인할 수 있는 label 이란 이름의 UILabel 도 하나 추가했습니다.




버튼을 눌렀을 때, Call Directory Extension 이 호출되도록 하겠습니다.


이 익스텐션을 호출하려면 익스텐션의 번들ID 를 알아야 합니다.

번들ID는 아래에서 확인합니다.









별표로 가림 ㅋㅋㅋ 이걸 복사해서 아래 소스처럼 넣어주면 됩니다.






import UIKit

import CallKit


class ViewController: UIViewController {


    @IBOutlet weak var label: UILabel!

    

    override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

    }


    @IBAction func onTapBtnInsert(_ sender: UIButton) {

        let manager = CXCallDirectoryManager.sharedInstance

        manager.reloadExtension(withIdentifier: "com.****.****.callkittest.calldirectory"){ error in

            if error != nil {

                // 에러 발생

                self.label.text = error!.localizedDescription

                

            } else {

                // 성공

                self.label.text = "success"

                

            }

        }

    }

}







콜킷을 사용하기 위해 추가해야 할 라이브러리 CallKit !

잊지말고 import 해 줍니다.







그럼 이제 실행!

익스텐션으로 실행하지 말고, 호스트앱으로 실행해주세요.











버튼을 누르기 전에 설정 - 전화 - 전화 차단 및 ID 활성화 도 잊으면 안됩니다.


활성화 안하면 에러(코드 6)가 나옵니다.








버튼을 눌렀더니, success 가 표시됩니다.

실제로 전화를 걸어 테스트해 보겠습니다.









전화정보 수신 화면에는 앱의 이름도 함께 표시됩니다.


테스트를 위해 국민은행 이체를 실행해 보았습니다.

다산콜센터와 국민은행 번호를 테스트로 넣었다가,

오름차순 맞추느라 번호 순서를 바꾸면서 라벨은 안바꿨더니

다산콜센터로 표시가 되고 있습니다 ㅋㅋㅋ







이렇게 간단한 걸...

애플은 좀 알려주지...







WRITTEN BY
minjee
우리는 무엇을 할 수 있을까?

,