티스토리 뷰

iOS

[iOS] Contacts 연락처 사용하기

Kim_Baechu 2021. 11. 25. 15:14

사용자의 연락처에 접근하는 방법입니다.

1. info.plist에 다음을 추가해주세요.

NSContactsUsageDescription

2.import ContactsUI

import ContactsUI

3. CNContactPickerDelegate

CNContactStore()에서 정보를 가져옵니다.

가져오기 위해서 key를 설정해야합니다.

FirstName - 이름 - CNContactGivenNameKey

LastName - 성 - CNContactFamilyNameKey

Company - 직장 - CNContactOrganizationNameKey

phone - 휴대전화 - CNContactPhoneNumbersKey

func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
    let store = CNContactStore()
    let keysToFetch = [
        CNContactGivenNameKey,
        CNContactFamilyNameKey,
        CNContactPhoneNumbersKey,
        CNContactOrganizationNameKey,
    ] as [CNKeyDescriptor]
    
    do {
        let predicate = CNContact.predicateForContacts(withIdentifiers: [contact.identifier])
        let contacts = try store.unifiedContacts(matching: predicate, keysToFetch: keysToFetch)
        guard let contact = contacts.first else { return }
        if contact.familyName.count == 0 && contact.givenName.count == 0 {
            nameLabel.text = "\\(contact.organizationName)"
        } else {
            nameLabel.text = "\\(contact.familyName)\\(contact.givenName)"
        }
        
        if let phone = contact.phoneNumbers.first { 
            phoneLabel.text = "\\(phone.value.stringValue)"
        }
        
        
    } catch {
        print("Failed to fetch, error: \\(error)")
    }
}

1) unifiedContacts()를 이용해서 fetch한 후에 사용해야 합니다.

2) keysToFetch에 없는 내용은 요청할 수 없습니다.

3) 이름이 없을 경우 직장명으로 이름이 설정됩니다.

4) 여러개의 연락처를 저장한 경우 첫 번째의 연락처로 설정합니다.

4. 연락처 요청

let status = CNContactStore.authorizationStatus(for: .contacts)
let vc = CNContactPickerViewController()
vc.delegate = self
switch status {
case .authorized:
    present(vc, animated: true, completion: nil)
default:
    CNContactStore().requestAccess(for: .contacts) { [weak self] success, error in
        guard let self = self else { return }
        if success {
            DispatchQueue.main.async {
                self.present(vc, animated: true, completion: nil)
            }
        } else {
            guard let url = URL(string: UIApplication.openSettingsURLString) else { return }
            if UIApplication.shared.canOpenURL(url) {
                UIApplication.shared.open(url, options: [:], completionHandler: nil)
            }
        }
    }
}

1) 연락처 권한을 확인합니다.

2) 연락처 권한이 있는 경우 연락처 picker를 보여줍니다.

3) 연락처 권한이 없는 경우 요청을 하고 거절 시 설정으로 이동시킵니다.

댓글
공지사항