[swift] 연락처(Contacts) 정보를 이용한 캘린더와 일정 연동

iOS 앱을 개발할 때 종종 연락처 정보와 캘린더 정보를 연동하여 사용하는 경우가 있습니다. 연락처에 저장된 정보를 가져와서 일정에 추가하거나 일정과 관련된 연락처 정보를 가져오는 등의 기능을 구현할 수 있습니다. 이번 블로그에서는 Swift 언어를 사용하여 연락처 정보를 가져와 캘린더와 일정을 연동하는 방법에 대해 알아보겠습니다.

1. 연락처 접근 권한 설정

먼저, 앱에서 연락처 정보에 접근하기 위해서는 Info.plist 파일에 연락처 접근에 대한 권한을 설정해주어야 합니다. 아래의 코드와 같이 Info.plist 파일에 NSContactsUsageDescription 키와 해당하는 사용 설명을 추가해줍니다.

<key>NSContactsUsageDescription</key>
<string>앱에서 연락처 정보에 접근하기 위해서는 연락처 목록을 읽고 쓸 수 있는 권한이 필요합니다.</string>

2. 연락처 정보 가져오기

앱에서 연락처 정보를 가져오기 위해서는 Contacts 프레임워크를 사용합니다. 아래의 코드는 연락처에서 이름과 전화번호를 가져오는 간단한 예제입니다.

import Contacts

func fetchContacts() {
    let store = CNContactStore()
    
    store.requestAccess(for: .contacts) { granted, error in
        guard granted else { return }
        
        let keys = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey] as [CNKeyDescriptor]
        let request = CNContactFetchRequest(keysToFetch: keys)
        
        do {
            try store.enumerateContacts(with: request) { contact, stop in
                let fullName = "\(contact.givenName) \(contact.familyName)"
                for phoneNumber in contact.phoneNumbers {
                    let number = phoneNumber.value.stringValue
                    print("Name: \(fullName), Phone Number: \(number)")
                }
            }
        } catch {
            print("Error fetching contacts")
        }
    }
}

3. 캘린더와 일정 연동하기

연락처 정보를 가져온 뒤에, 해당 정보를 사용하여 캘린더와 일정을 연동할 수 있습니다. 아래의 코드는 가져온 연락처 정보를 사용하여 iOS 캘린더에 새로운 일정을 추가하는 예제입니다.

import EventKit

func addEventToCalendar(title: String, startDate: Date, endDate: Date, contactName: String) {
    let eventStore = EKEventStore()
    
    eventStore.requestAccess(to: .event) { granted, error in
        guard granted else { return }
        
        let event = EKEvent(eventStore: eventStore)
        event.title = title
        event.startDate = startDate
        event.endDate = endDate
        // Set other event properties
        
        // Add related contacts
        event.structuredLocation = EKStructuredLocation(title: contactName)
        
        do {
            try eventStore.save(event, span: .thisEvent)
        } catch {
            print("Error saving event")
        }
    }
}

결론

이렇게 연락처 정보를 가져와 캘린더와 일정을 연동하는 방법에 대해 알아보았습니다. 개발자는 이러한 기능들을 활용하여 사용자 친화적이고 편리한 앱을 개발할 수 있습니다. 이를 통해 사용자들은 연락처 정보와 캘린더 정보를 효율적으로 활용할 수 있게 됩니다.

참고문헌: