개발/Swift

Contact Framework 사용하여 연락처 불러오기

덤벨로퍼 2024. 9. 3. 15:05

 

연락처를 불러 오기 위해서는 연락처 권한이 필수임

CNContactStore().requestAccess(for: .contacts) { isGranted, _ in

}

연락처 권한 허용 여부는 이후로 이렇게 확인 가능

CNContactStore.authorizationStatus(for: .contacts) == .authorized

권한 허용 이후에는 contact 를 통해 연락처에 접근 가능함

static private func getNewContacts() async -> [String: String] {
        let contactStore = CNContactStore()
        guard (try? await contactStore.requestAccess(for: .contacts)) == true else { return [:] }
        
        let keys = [
            CNContactFormatter.descriptorForRequiredKeys(for: .fullName),
            CNContactPhoneNumbersKey
        ] as? [CNKeyDescriptor] ?? [] //연락처와 full name 만 필요함
        
        let request: CNContactFetchRequest = CNContactFetchRequest(keysToFetch: keys)
        
        request.sortOrder = CNContactSortOrder.userDefault
        var newContacts: [String: String] = [:]
        
        try? contactStore.enumerateContacts(with: request, usingBlock: { (contact, _) in
            if contact.phoneNumbers.isEmpty { return }
            let phoneNumber = contact.phoneNumbers[0].value.stringValue.verifiedPhoneNumberString() // 폰 번호 받아옴
            let phoneValidation = NSPredicate(format: "SELF MATCHES %@", Config.RegularExpression.PHONE_KOREA) //유효성 검사 진행
            if phoneValidation.evaluate(with: phoneNumber) {
                let fullName = contact.familyName + contact.givenName
                newContacts[phoneNumber] = fullName
            }
        })
        return newContacts
    }