본문 바로가기
iOS/Swift

Swift Contacts read and write (주소록 읽기, 쓰기)

by DnaJ 2019. 1. 13.
반응형

Swift Contacts read and write (주소록 읽기, 쓰기) 


Swift Contacts read and write. 

주소록에 이름, 전화번호, email을  읽고 쓰는 작업들이 필요했다.

iOS 9.0이상 일경우 하기와 같은 방법으로 사용할 수 있다.



NSContactsUsageDescription등록하기


주소록에 접근하기 위해서는 권한을 반드시 획득 받아야 한다. 

iOS 10.0 이상 에서는 반드시 plist에 NSContactsUsageDescription을 등록 해야 한다.


NSContactsUsageDescription을 등록하는 방법이다.



일단 plist파일을 찾는다!!


방법은 2가지 있다. 둘중에 편한 방법으로 추가하면 된다.


1. plist파일을  source형태로 열어서 xml형태로 추가하기

plist 파일에 오른쪽 클릭을 하여 Open As -> Source Code를 선택한다




<dict> 태그 사이에 아래와 같이 추가한다


<key>NSContactsUsageDescription</key>

<string></string>


아래와 비슷하게 들어갈것이다.


<dict>

<key> key name </key>

<string>  value </string>

.

.

.

 <key>NSContactsUsageDescription</key>

<string></string>

</dict>


NSContactsUsageDescription등록이 끝났다.


2. plist파일을 Property List로 열어서 추가하기

plist파일을 선택하면 기본적으로 Property List형태로 나온다.


빈화면에서 오른쪽 클릭을 하여 Add Row를 선택한다.



Add Row 선택 시 아래와 같은 화면을 볼수 있을것이다.


Privacy - Contacts Usage Description 입력한다

대소문자 띄어쓰기를 제대로 한하여 입력한다면 자동완성을 할수 있을것이다.


입력 완료 화면




Contacts Read - 주소록 읽기

    var contacts: NSMutableArray = NSMutableArray()


    private func readContacts() {

        let store = CNContactStore()

        

        // Permission 획득

        store.requestAccess(for: .contacts) { (granted, error) in

            guard granted else {

                return;

            }

            

            // Request 생성

            let request: CNContactFetchRequest = self.getCNContactFetchRequest()

            

            // 주소록 읽을 때 정렬해서 읽어오도록 설정

            request.sortOrder = CNContactSortOrder.userDefault

            

            // Contacts 읽기

            // 주소록이 1개씩 읽혀서 usingBlock으로 들어온다.

            try! store.enumerateContacts(with: request, usingBlock: { (contact, stop) in

                

                // Phone No가 없을때 return    

                if contact.phoneNumbers.isEmpty {

                    return

                }

                

                // NSMutableArray Add contact

                // 읽어온 주소록을 NSMutableArray에 저장

                self.contacts.add(contact)

            })

            

            self.saveContact()

        }

    }


    // Request 생성

    private func getCNContactFetchRequest() -> CNContactFetchRequest {

        // 주소록에서 읽어올 key 설정

        let keys: [CNKeyDescriptor] = [CNContactFormatter.descriptorForRequiredKeys(for: .fullName),

                                       CNContactPhoneNumbersKey,

                                       CNContactEmailAddressesKey,

                                       CNContactJobTitleKey,

                                       CNContactPostalAddressesKey] as! [CNKeyDescriptor]

        

        return CNContactFetchRequest(keysToFetch: keys)

    }

    



getCNContactFetchRequest 함수에 보면 keys가 있다.

주소록에서 어떤 정보들은 불러올 것인지 정하는 key라고 생각하면 좋겠다.

CNContact에 정의가 되어 있으며 command + 클릭을 하면 정의된 것들을 볼수가 있다. (복사해서 붙여넣으려니 정보가 생각보다 많다...)


주소록 저장


    

    private func saveContact() {

        

        let store = CNContactStore()

        

        // Permission 획득

        store.requestAccess(for: .contacts) { (granted, error) in

            guard granted else {

                return;

            }

            

            let contact:CNMutableContact = self.getNewContact()

            

            let request = CNSaveRequest()

            request.add(contact, toContainerWithIdentifier:nil)

            

            // 저장

            try! store.execute(request)

        }

    }

    

    // 새로 등록할 주소록 생성

    private func getNewContact() -> CNMutableContact {

        let contact = CNMutableContact()

        contact.givenName = "name"

        contact.familyName = "familyName"

        

        let phone = CNLabeledValue(label:CNLabelPhoneNumberMobile,

                                   value:CNPhoneNumber(stringValue:"010-0000-0000"))

        let tel = CNLabeledValue(label:CNLabelPhoneNumberMain,

                                 value:CNPhoneNumber(stringValue:"02-0000-0000"))

        contact.phoneNumbers = [phone, tel]

        

        let email: NSString = "bizCard@gmail.com"

        contact.emailAddresses = [CNLabeledValue(label:CNLabelWork, value:email)]

        

        return contact

    }

    

    


주소록 읽기 쓰기 끝!!!

반응형

'iOS > Swift' 카테고리의 다른 글

RxSwift 시작하기 (설치 & Button Tap Event - DisposeBag, rx.Tap )  (0) 2019.05.03
RxSwift (ReactiveX)  (0) 2019.04.26
Swift Realm (2) - 조회하기  (0) 2019.01.06
Swift Realm (1)  (0) 2018.12.06
Swift Xib localization  (0) 2018.11.18

댓글