티스토리 뷰

반응형

CallKit 을 json 을 읽어와서 업데이트하는 방식에 대해서 공유하겠습니다.


1. 3개 이상의 데이터를 CallDirectory에 업데이트하는 방법

CalDirectory.swift의 addIdentificationEntry(_) 에 등록하는데 있어서 3개 이상 등록하는데 이슈를 쉽게 발견할 수 있습니다.


1) 3개 이상 수신자 확인 데이터 등록

2) 설정 > 전화 > 전화 차단 및 ID 진입

3) 해당앱 On 시도 


위의 방식으로 수행 시 무한 로딩 화면 또는 "알림" 메시지로 "개발자에게 문의하세요." 라는 문구가 나옵니다.


해결 방안으로 두 가지 대안을 생각하였습니다.

1) 쓰레드로 별도로 돌려야 하는가? 

2) 데이터 넣을 때 마다 1초 딜레이를 주고 넣어야하는가? 

위 두가지 방안을 시도하였으나 문제는 해결되지 않았습니다.


Apple Developer 통해서 Custom 으로 동작하는 방식에 대해서 친절히 적혀있는 글을 발견했습니다.


1
2
3
4
5
6
7
8
9
10
class CustomCallDirectoryProvider: CXCallDirectoryProvider {
    override func beginRequest(with context: CXCallDirectoryExtensionContext) {
        let labelsKeyedByPhoneNumber: [CXCallDirectoryPhoneNumber: String= [ … ]
        for (phoneNumber, label) in labelsKeyedByPhoneNumber.sorted(by: <) {
            context.addIdentificationEntry(withNextSequentialPhoneNumber: phoneNumber, label: label)        
        }
        context.completeRequest()
    }

cs


labelsKeyedByPhoneNumber.sorted(by: <)


sorted을 해서 넣어주는 방식으로 3개 이상의 데이터를 넣을 수 있었습니다.



2. Json 파일을 읽어서 업데이트 하는 방법

현재 CallDirectiryExtension 은 AppDelegate와 별도의 폴더로 구성되어서 Json 파일 또한 CallDirectiryExtension 폴더 안에 넣어야 합니다.


1) 사용자가 작성한 Json 파일을 CallDirectiryExtension 폴더에 넣습니다.

// PhonDBData.json


[  

   {  

      "phoneNumber":"8211111111",

      "name":"Type_1"

   },

   {  

      "phoneNumber":"8200000000",

      "name":"Type_2"

   },

   {  

      "phoneNumber":"8233333333",

      "name":"Type_3"

   },

   {  

      "phoneNumber":"8244444444",

      "name":"Type_4"

   }

]


2) CallDirectoryXX.swift에 있는 addIdentificationPhoneNumbers(_ CXCallDirectoryExtensionContext) 에서 json File을 가져옵니다.

   JSON 파일 가져오기 (클릭)


3) 가져온 json file을 labelsKeyedByPhoneNumber: [CXCallDirectoryPhoneNumber: String] 형태로 저장합니다.


1
2
3
4
5
6
var labelsKeyedByPhoneNumber: [CXCallDirectoryPhoneNumber: String= [ : ]
        
for data in dbData {
      labelsKeyedByPhoneNumber[CXCallDirectoryPhoneNumber.init(data.phoneNumber)!= data.name.replace(target: "_", withString: " ")
}
cs



4) 저장한 labelsKeyedByPhoneNumber을 addIdentificationEntry 에 저장하여 데이터를 업로드 합니다.


1
2
3
for (phoneNumber, label) in labelsKeyedByPhoneNumber.sorted(by: <) {
            context.addIdentificationEntry(withNextSequentialPhoneNumber: phoneNumber, label: label)
 }

cs


지금까지 설명한 소스는 Github 에 올렸습니다.


소스보기



정리

CallKit을 사용하는 방식에 대해서 공유 하였습니다. 이 방식의 문제점은 업데이트 된 내용이 있을 때 마다 json을 로컬에 저장하여 새로 배포하는 문제가 있습니다. 데이터 업로드 방식이 local json 이 아닌 방식에 대해서 다음 포스트에서 공유 하겠습니다.



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

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



참고

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






반응형
댓글