티스토리 뷰

반응형

스팸전화는 모든 사람이 피하고 싶은 전화이다!

위 정의는 모든 사람이 동의할 것입니다. 

모두가 피하고 싶은 스팸전화를 이미 여러 앱에서 모르는 번호에 대한 정보를 알려주는 기능을 제공하고 있습니다.


위 기능은 IOS 10.0 미만에서는 수신자의 번호를 알 수 없어서 구현이 힘들었습니다.

IOS 10.0 이상부터는 callKit을 지원하면서 수신 시 수신자의 번호를 얻어올 수 있도록 하였습니다.


제가 테스트한 앱의 최종 결과 화면을 보면 앱 이름 옆에 미리 설정한 번호에 해당하는 Label을 표시하고 있습니다.

이런 기능은 Call Directory Extension에서 전화번호 일치 유무를 검사하여 누구로부터 전화가 오는지 확인 할 수 있습니다.

제가 구현한 방식과 구현 하면서 어려웠던 점을 나누겠습니다.


<callkit 적용 화면>


[앱 이름] 발신자 정보 : [내용] 


튜토리얼

1. Call Directory Extension 생성

1) Xcode 새 프로젝트 생성 후 [File] - [New] - [Target] 클릭 합니다.

2) Call Directory Extension 클릭 후 [Next] 누릅니다.




3) Product Name을 입력 후 [Finish] 누릅니다.


2. addIdentificationPhoneNumbers 구현

1) Call Directory Extension 로 생성한 swift 파일을 열어서 [addIdentificationPhoneNumbers] 함수로 이동합니다.

2) PhoneNumbers[CXCallDirectoryPhoneNumber] 와 labels[String]의 값을 변경합니다. 

  phoneNumbers은 수신 시 catch할 번호이며, label은 해당 catch된 번호의 표시할 이름을 적어줍니다.

  (순서가 맞아야합니다.)


3. 앱 실행

앱 실행 방식은 1) Xcode로 실행할 프로젝트 2) Call Directory Extension 로 생성한 프로젝트 순으로 실행합니다.




3번까지 적용하면 내가 적용한 번호로 전화올 시 설정한 Label 값으로 화면에 표시하게 됩니다.

참고로 이미 저장된 번호일 경우 표시 안되니, 저장 안된 전호로 테스트 해야 합니다.


여기서 문제점이 발생합니다.

Call Directory Extension 로 생성한 프로젝트의 swift파일이 내용 변경 후 업데이트가 안되는 문제가 발생합니다. 

그래서 제가 해결한 방식은 두 가지로 하였습니다.


1. 프로젝트 번들 값을 변경

프로젝트 번들 값을 변경하여 매번 새로운 값으로 로드하는 방식입니다.

일시적은 해결은 되나 앱 배포 시 데이터 업데이트 할 때마다 앱 배포 해야하는 문제점이 발생합니다.


2. 앱 실행 시 cxcalldirectorymanager 을 통한 reload 방식

가장 보편적으로 사용하는 방식이고, 앱 배포 없이 앱 실행 시 reload 방식입니다.

[AppDelegate 의 didFinishLaunchingWithOptions 메소드]에서 다음 코드를 입력합니다.


1
2
3
4
5
6
7
8
9
let callDirManager = CXCallDirectoryManager.sharedInstance
callDirManager.reloadExtension(withIdentifier: "com.kcs.callkitExamples.CallDirectoryExtensions") { (error) in
    if (error == nil){
           print("success!")
    }else{
           print("error")
       }
}
 

cs

3. 전화 차단 및 ID 등록

디바이스에 해당 앱을 백그라운드로 돌려야 합니다.

아이폰 10.0 이상에서는 앱을 등록하여 전화 차단 및 ID을 체크하여 등록된 Label로 보여줍니다.


1) 앱 설치된 iPhone에서 설정 - 전화 - 전화 차단 및 ID  클릭 합니다.

2) 설치한 앱을 활성화 합니다.



3) 설정한 번호로 전화 걸어 Label이 표시되는 것을 확인합니다.


정리

Call Directory Extension 생성과 AppDelegate에서 CXCallDirectoryManager Reload 하는 방식을 알아봤습니다.


위의 방식은 2개까지 적용되는 방식입니다. 3개 이상을 넣어주려고 하면 [전화 차단 및 ID]에 앱 활성화가 안됩니다.

다음 포스트로 내부 DB를 호출하여  3개 이상의 데이터를 넣는 방식을 공유하겠습니다.



[Swift4] CallKit 구현 (수신자 확인) [2/3]

[Swift4] CallKit 구현 (수신자 확인) [3/3]


참고

https://www.raywenderlich.com/150015/callkit-tutorial-ios

- https://developer.apple.com/documentation/callkit/cxcalldirectorymanager

https://basementmedia.no/





반응형
댓글