투케이2K

100. (ios/swift) 전화번호 주소록 데이터 읽기 수행 실시 - CNContactStore 본문

IOS

100. (ios/swift) 전화번호 주소록 데이터 읽기 수행 실시 - CNContactStore

투케이2K 2022. 1. 16. 11:08

[개발 환경 설정]

개발 툴 : XCODE

개발 언어 : SWIFT

 

[방법 설명]

 

[소스 코드]

    // MARK: [전화번호 주소록에 저장된 데이터 확인 메소드]
    let store = CNContactStore() // 전화번호 주소록 접근 객체
    func readAddress(){
        print("")
        print("===============================")
        print("[ViewController >> readAddress() :: 전화번호 주소록에 저장된 데이터 읽기 실시]")
        print("===============================")
        print("")

        // [퍼미션 권한 확인]
        self.store.requestAccess(for: .contacts) { (granted, error) in
            guard granted // MARK: [권한이 부여된 경우]
            else { // MARK: [권한이 부여되지 않은 경우]
                print("")
                print("===============================")
                print("[ViewController >> readAddress() :: 전화번호 주소록 접근 권한 비활성 상태]")
                print("===============================")
                print("")
                
                // [메인 큐에서 비동기 방식 실행 : UI 동작 실시]
                DispatchQueue.main.async {
                    let alert = UIAlertController(title: "알림", message: "전화번호부 접근 권한을 허용해주세요.", preferredStyle: .alert)
                    let okBtn = UIAlertAction(title: "확인", style: .default) { (action) in
                        alert.dismiss(animated: true, completion: nil)
                        // [사용자 앱 설정창 이동 수행 실시]
                        let settingsURL = NSURL(string: UIApplication.openSettingsURLString)! as URL
                        UIApplication.shared.open(settingsURL, options: [:], completionHandler: nil)
                    }
                    let noBtn = UIAlertAction(title: "취소", style: .cancel) { (action) in
                        // [팝업창 닫기]
                        alert.dismiss(animated: true, completion: nil)
                    }
                    alert.addAction(okBtn)
                    alert.addAction(noBtn)
                    self.present(alert, animated: true, completion: nil)
                }
                return
            }
            print("")
            print("===============================")
            print("[ViewController >> readAddress() :: 전화번호 주소록 접근 권한 활성 상태]")
            print("===============================")
            print("")

            // [Request 생성 : 전화번호 주소록에서 알아오려는 key 지정]
            let request: CNContactFetchRequest = self.getCNContactFetchRequest()

            
            // [주소록 읽을 때 정렬 실시]
            request.sortOrder = CNContactSortOrder.userDefault

            
            // Contacts 주소록 읽기 [주소록이 1개씩 읽혀서 usingBlock으로 들어옵니다]
            try! self.store.enumerateContacts(with: request, usingBlock: { (contact, stop) in
                if contact.phoneNumbers.isEmpty == false { // 휴대폰 번호가 있을 경우만 배열에 추가 실시
                    
                    // [이름]
                    let name = contact.familyName + contact.givenName
                    
                    // [전화번호]
                    let phone = contact.phoneNumbers[0].value.value(forKey: "digits") ?? ""
                    
                    // [이메일]
                    let email = contact.emailAddresses[0].value ?? ""
                    
                    print("")
                    print("===============================")
                    print("[ViewController >> readAddress() :: 전화번호 주소록 데이터 읽기 실시]")
                    print("name :: ", name)
                    print("phone :: ", phone)
                    print("email :: ", email)
                    print("===============================")
                    print("")
                }
            })
        }
    }
    // [Request 객체 생성 - 주소록에서 읽을 key 지정]
    private func getCNContactFetchRequest() -> CNContactFetchRequest {
        // [주소록에서 읽어올 key 설정]
        let keys: [CNKeyDescriptor] = [CNContactFormatter.descriptorForRequiredKeys(for: .fullName), // 이름
                                       CNContactPhoneNumbersKey, // 전화번호
                                       CNContactEmailAddressesKey, // 이메일
                                       CNContactJobTitleKey, // 직장
                                       CNContactImageDataAvailableKey, // 이미지
                                       CNContactThumbnailImageDataKey, // 이미지
                                       CNContactPostalAddressesKey] as! [CNKeyDescriptor]
        return CNContactFetchRequest(keysToFetch: keys)
    }
 

[결과 출력]

 

 

반응형
Comments