如何用Swift和EventKit擷取iOS日曆行程

這篇文章要來分享如何開發iOS app擷取日曆行程的範例。為了要可以獲得日曆事件,我們需要用到的是EventKit。

要讀取calendar,首先我們需要一個EKEventStore物件,有了這個物件,我們就可以對calendar的內容進行查詢。而app要使用EKEventStore前,我們還需要先和使用者請求權限。

import Foundation
import EventKit
class EventKitDataModel {
    private let eventStore = EKEventStore()
   
    func authorizeEventKit(completion: @escaping EKEventStoreRequestAccessCompletionHandler) {
        eventStore.requestAccess(to: EKEntityType.event) { (accessGranted, error) in
            completion(accessGranted, error)
        }
    }
}

如上,我們在EventKitDataModel中首先做了一個EKEventStore,然後authorizeEventKit這個函式會做請求權限的動作。

有了權限以後,存取calendar事件就很簡單了,以下範例是獲取所有在兩個日期間的calendar事件行程。

func collectData(since: Date, until: Date) {  
        let timefilter = self.makeTimePredicate(since: since, until: until)
        
        //Load events
        var events: [EKEvent]? = nil
        events = eventStore.events(matching: timefilter)
        if let allevents = events {
            for event in allevents {
                //Do something to the event
                //e.g. Get the title of the event
                let eventtitle = event.title!
            }
        }
    }
func makeTimePredicate (since startDate: Date, until endDate: Date) -> NSPredicate {
        return eventStore.predicateForEvents(withStart: startDate, end: endDate, calendars: nil)
    }

在這個函數中我們用since和until這兩個變數來做一個TimePredicate稱為timefilter,就是我們的查詢條件。這部份是以makeTimePredicate這個函式實作。接著我們就可以用EKEventStore的.events()獲取查詢結果。每一個事件是一個EKEvent物件,此範例在後面的迴圈裡,只是單純的將這個物件的title內容設給一個區域變數,如果需要進行更多操作,可以查詢Swift manual中對於EKEvent的說明。


謝謝你看完這篇文章。如果你喜歡我的讀書心得,請到Twitter追蹤新發佈的讀書心得。想要更了解我們嗎?追蹤或訂閱Facebook粉專和我們交流、獲得最新文章通知吧。

如果你覺得這篇文章不錯,請在下面用力的拍五次手,給我們一點鼓勵!
對於如何拍手有疑問嗎?請見快速教學

如果這篇文章或許會對你的朋友有幫助,請按下面的分享按鈕,將這篇文章分享給你的朋友。

若有興趣在你的網站或出版品引用這篇文章或部份內容,請來信索取授權。

發表迴響