티스토리 뷰

반응형

CallKit 에 번호 저장을 할 때마다 앱을 배포하는 것에 대해서 설명하였습니다.

CallKit 구현(수신자 확인) 페이지로 이동

이어서 앱 배포 없이 앱 접속 시 정보를 CallKit에 전달하여 전화번호 데이터 갱신하는 방식에 대해서 공유 하겠습니다.


[1] App Group 설정

프로젝트 파일 > 앱(Callkit 각각) TARGETS 클릭 > Capablities > App Groups


[그림1] Group Name 추가 방법



1. [그림1]에 보이는 화면으로 이동 하여 App Groups을  "On"으로 변경합니다.

 

2. App Groups의 '+ 버튼'이 보입니다. '+' 버튼을 클릭하여 App Group에 사용할 이름을 추가 합니다.


[그림 2] CallKit Group 설정 화면 




[그림3] App Group  설정 화면



[그림2]과 [그림3]처럼 App Groups을 App과 Callkit 둘다 적용합니다.


[2] Groups ID 을 이용한 UserDefault

UserDefaults을 suiteName에 Groups ID을 넣게 된다면 Groups으로 연결된 앱에서는 UserDefaults을 공동으로 사용할 수 있습니다.


1
UserDefaults(suiteName: "group.com.kcs.samepleCallkit")


샘플소스에서 사용한 방식은 json 파일을 class로 변경한 다음 class을 encode 하여 UserDefaults 에 넣어 CallKit 과 통신하도록 하였습니다.


Json > Class로 변경 > Archive > UserDefaults 에 넣음 > CallKit Project 


1. UserDefaults 저장 (App)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// Group의 UserDefaults에 DB 데이터를 저장합니다.
func saveUserData(){
    let userDefaults = UserDefaults(suiteName: "group.com.kcs.samepleCallkit")
    let userData = loadJsonFile()
    
    try? userDefaults?.set(PropertyListEncoder().encode(userData), forKey: "dbData")
}
 
// DB Data load Json File
func loadJsonFile() -> Array<UserData>{
    var dbData: Array<UserData> = Array<UserData>()
    
    do {
        if let file  = Bundle.main.url(forResource: "DBData", withExtension: "json"){
            let data  = try Data(contentsOf: file)
            let json = try JSONSerialization.jsonObject(with: data, options: [])
            
            
            if let objects = json as? [Any]{
                for object in objects {
                    dbData.append(UserData.dataFormJSONObject(json: object as! [String : AnyObject])!)
                }
            } else{
                print("JSON is invalid")
            }
        }else{
            print("no file")
        }
    }  catch {
        print(error.localizedDescription)
    }
    
    return dbData
}

cs


2. UserDefaults 사용 (CallKit)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//UserData는 보내는 부분과 받는 부분에 둘다 생성해줘야하는 문제가 있습니다.
//프레임워크로 설정을 하는 방식 또는 이번 샘플 소스처럼 두개를 만들어서 관리해야하는 방식 두가지로 나눠집니다.
if let data = userDefaults?.object(forKey:"dbData"as? Data {
    if let userData = try? PropertyListDecoder().decode([UserData].self, from: data) {
        for data in userData {
            //실직적인 데이터를 넣어주는 부분
            labelsKeyedByPhoneNumber[CXCallDirectoryPhoneNumber.init(data.phoneNumber)!= data.name
        }
    }
}
 
//3개 이상으로 구성된 것은 다음과 같은 방식으로 sort 하여 설정합니다.
for (phoneNumber, label) in labelsKeyedByPhoneNumber.sorted(by: <) {
    context.addIdentificationEntry(withNextSequentialPhoneNumber: phoneNumber, label: label)
}

cs


* PropertyListEncoder().encode : Class Data를 UserDefault에서 Encode 할 때 사용

* PropertyListDecoder().decode : Class Data를 UserDefault에서 Decode 할 때 사용


AppGroups 한 곳에서 UserDefault 을 공용으로 사용할 수 있기에 데이터 갱신을 실시간으로 할 수 있습니다. 위와 같은 Group 기능으로 "Widget" 도 데이터 통신으로 실시간 데이터로 업데이트 하고 있습니다. 


CallKit과 함께 App Groups 하는 방법에 대해서 공유하였습니다. 소스코드는 여기 에서 확인 할 수 있습니다.


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

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




반응형
댓글