-
Swiftui CNCompact카테고리 없음 2024. 1. 15. 21:10
1. CNCompact 란
CNCompact를 많이 못들어본 사람도 분명히 있을거라고 생각한다.
이번 프로젝트에서 채팅앱을 클론해보다가 알게 되었는데 휴대폰 주소록에 있는 데이터들을 원하는데로 뽑아서 View 에 보여줄 수도,
간단한 로직을 처리할 수있게 되어있다.
일단 항상 그렇듯이 apple developer 에 가서 정의를 확인해보자
음, 이렇다고 한다. 해석해 보자면
CNContact 객체는 연락처 정보의 불변 복사본을 저장하므로 이 객체에서 정보를 직접 변경할 수 없습니다. 연락처 객체는 스레드 안전하므로 앱의 어떤 스레드에서도 액세스할 수 있습니다.
연락처 정보를 수정하려면 mutableCopy() 메서드를 호출하여 동일한 정보를 가진 CNMutableContact 개체를 가져옵니다. mutableContact를 수정한 후에는 CNContactStore 개체를 사용하여 변경 내용을 연락처 데이터베이스에 다시 저장합니다.
당신은 연락처 데이터베이스의 모든 연락처에 고유한 ID를 가지고 있으며, 이 ID는 식별자 속성을 사용하여 접근할 수 있다. 동일한 연락처의 가변 버전과 불변 버전은 동일한 식별자를 가지고 있다. 라고 파파고가 말하지만 ,,,개발자들의 언어로 한번더 번역을 하자면 readonly 의 상태로 불러와서 내가 원하는 연락처 데이터 베이스를 사용할 수 있다고 말하는것같다.
2. 사용예시
enum ContactError : Error{ case permissionDenied } protocol ContactServiceType { func fetchContacts() -> AnyPublisher<[User], ServiceError> } class ContactService : ContactServiceType { func fetchContacts() -> AnyPublisher<[User], ServiceError>{ Future{ [weak self] promise in self?.fetchContacts { promise($0) } } .mapError{.error($0)} .eraseToAnyPublisher() } private func fetchContacts(completion: @escaping (Result<[User] , Error>) -> Void) { let store = CNContactStore() store.requestAccess(for: .contacts) { [weak self] granted, error in if let error { completion(.failure(error)) return } guard granted else { completion(.failure(ContactError.permissionDenied)) return } self?.fetchContacts(store: store,completion: completion) } } private func fetchContacts(store: CNContactStore,completion : @escaping (Result<[User], Error>) -> Void){ let keyToFetch = [ CNContactFormatter.descriptorForRequiredKeys(for: .fullName), CNContactPhoneNumbersKey as CNKeyDescriptor ] let request = CNContactFetchRequest(keysToFetch: keyToFetch) var users : [User] = [] do { try store.enumerateContacts(with: request) { contact , _ in let name = CNContactFormatter.string(from: contact, style: .fullName) ?? "" let phoneNumber = contact.phoneNumbers.first?.value.stringValue let user : User = .init(id: UUID().uuidString, name: name,phoneNumber: phoneNumber) users.append(user) } completion(.success(users)) } catch { completion(.failure(error)) } }
이것은 내 ContactService 파일이다.
사실 위내용은 어디서든 많이 볼 수 있는 소스코드이기에 상세한 설명은 생략하고 , 내가 좀 고생했던 내용만 짚고 넘어가려고한다.
일단 가장 중요한것은 fetch 이다. 이함수를 먼저 구성하지않으면 빨간줄이 너무 많이뜬다.디버깅 pause 만 7번했다. 천천히 차근차근 불러오면 할 수 있을거라고 믿는다. 또한 info 에가서 privacy contact Usage 를 선택하고 내가 원하는 String 을 넣어준다.
이런식으로 넣어주게 되면 내 주소록에 있는 녀석들을 불러올수 있다 . 필자는 firebase 실시간 database 와 연동하여서 이후에 작업을 해나갔지만 단순히 테스트 용도라면 이정도로 해도 시뮬에 있는 데이터는 불러올 수 있을것이다.
Error 처리는 항상 하길 바라고 import 에 contact 추가하기 이정도면 주의하면서 프로젝트를 진행하면 될것같다.
3. 느낀점
apple developer 는 신이다.
사실 모든 개발을 해나가면서 공식문서를 참고하는것은 가장 큰 배움의 길이라고 생각한다.
천천히 내가 써나가는 코드에 대한 리뷰와 이해를 하며 꾸준히만 한다면 누구든 멋진 개발자가 될것이라고 믿으며,
나 또한 오늘 하루를 이겨낸다.
https://developer.apple.com/documentation/contacts/cncontact