SwiftでiOSカレンダーを使う

SwiftiOS標準カレンダーを使う方法をメモ。

swift calendarとかで検索すると独自UIを作る情報は検索されるけど、あんまりEventKitを使った情報が出てこなかった。 リファレンス上のデモもswiftのバージョンがないし。

Google Calendarの時も思ったけど、あんま情報ないんだよね。ライブラリー(?)の更新とかもあんまないし。カレンダーって人気ないのかな?w

バージョン

環境 バージョン
Xcode 7.3, 7.2
Swift 2.2, 2.1
iOS 9.3, 9.2

参照したドキュメント

EventKitのリファレンス

developer.apple.com

プログライミングガイド

https://developer.apple.com/jp/documentation/EventKitProgGuide.pdf

使い方

準備

EventStore経由であれこれするので、初期化

// EventStoreを初期化
let eventStore = EKEventStore()

カレンダーへのアクセス許可の取得

// 許可状況を確認して、許可されていなかったら許可を得る
func allowAuthorization() {
    if getAuthorization_status() {
        // 許可されている
        return
    } else {
        // 許可されていない
        eventStore.requestAccessToEntityType(.Event, completion: {
        (granted, error) in
            if granted {
                return
            }
            else {
                print("Not allowed")
            }
        })
        
    }
}

// 認証ステータスを確認する
func getAuthorization_status() -> Bool {
    // 認証ステータスを取得
    let status = EKEventStore.authorizationStatusForEntityType(.Event)
    
    // ステータスを表示 許可されている場合のみtrueを返す
    switch status {
    case .NotDetermined:
        print("NotDetermined")
        return false
        
    case .Denied:
        print("Denied")
        return false
        
    case .Authorized:
        print("Authorized")
        return true
        
    case .Restricted:
        print("Restricted")
        return false
    }
}

カレンダーの一覧の取得

let calendars = eventStore.calendarsForEntityType(.Event)

イベントの一覧を取得

func listEvents() {
    // 検索条件を準備
    let startDate = NSDate()
    let endDate = NSDate()
    let defaultCalendar = eventStore.defaultCalendarForNewEvents    // ここではデフォルトのカレンダーを指定
    // 検索するためのクエリー的なものを用意
    let predicate = eventStore.predicateForEventsWithStartDate(startDate, endDate: endDate, calendars: [defaultCalendar])
    // イベントを検索
    let events = eventStore.eventsMatchingPredicate(predicate)
}

イベントの新規登録

func addEvent() {
    // イベントの情報を準備
    let startDate = NSDate()
    let cal = NSCalendar(identifier: NSCalendarIdentifierGregorian)!
    let endDate = cal.dateByAddingUnit(.Hour, value: 2, toDate: startDate, options: NSCalendarOptions())!
    let title = "カレンダーテストイベント"
    let defaultCalendar = eventStore.defaultCalendarForNewEvents
    // イベントを作成して情報をセット
    let event = EKEvent(eventStore: eventStore)
    event.title = title
    event.startDate = startDate
    event.endDate = endDate
    event.calendar = defaultCalendar
    // イベントの登録
    do {
        try eventStore.saveEvent(event, span: .ThisEvent)
    } catch let error {
        print(error)
    }
    
}

イベントの削除

func deleteEvent(event: EKEvent) {
    do {
        try eventStore.removeEvent(event, span: .ThisEvent)
    } catch let error {
        print(error)
    }
}