티스토리 뷰
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]
'프로그래밍 > iOS' 카테고리의 다른 글
[SWIFT] Alarm을 이용한 LocalNotification 표시 (0) | 2018.01.01 |
---|---|
[SWIFT] LOCAL JSON FILE 호출하기 (0) | 2017.12.29 |
[SWIFT] CallKit 구현 (수신자 확인) [2/3] (0) | 2017.12.29 |
[SWIFT] CallKit 구현 (수신자 확인) [1/3] (2) | 2017.12.29 |
[SWIFT] DatePickerView 스크롤 시 다른 기능 방지 (0) | 2017.12.22 |
- view
- 스코어헬퍼
- 고시문
- 탁구
- 임용고시
- Kotlin
- 안드로이드
- 미션차이나센터
- IT
- push
- missionchina
- issue
- RXjava
- DI
- 코틀린
- 알고리즘
- IOS
- MCC
- 고시문헬퍼
- 디자인패턴
- Android
- flutter
- Android Studio
- 선교
- swift
- 점수판
- java
- missioon
- 패턴
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |