iOS日曆相關操做--讀取系統日曆、添加事件到系統日曆

1 讀取系統日曆html

        let eventStore = EKEventStore()
        
        let tempFormatter = NSDateFormatter()
        tempFormatter.dateFormat = "dd.MM.yyyy HH:mm"
        
        //獲取一個時間段中的日曆事件
        let startDate = tempFormatter.dateFromString("10.08.2016 15:10")!
        let endDate = tempFormatter.dateFromString("12.08.2016 15:30")!

        let predicate = eventStore.predicateForEventsWithStartDate(startDate, endDate: endDate, calendars: [eventStore.defaultCalendarForNewEvents])
        
        //獲取這個時間段中的全部日程
        let events = eventStore.eventsMatchingPredicate(predicate)

2 添加事件到系統日曆ios

     let eventStore = EKEventStore()
eventStore.requestAccessToEntityType(.Event) { (granted, error) in dispatch_async(dispatch_get_main_queue(), { if error != nil { //發生錯誤 } else if !granted { //不容許訪問日曆 } else { //建立事件 let event = EKEvent(eventStore: eventStore) event.title = "lallallallal" let tempFormatter = NSDateFormatter() tempFormatter.dateFormat = "dd.MM.yyyy HH:mm" //建立一個時間段的日曆事件 event.startDate = tempFormatter.dateFromString("11.08.2016 15:20")! event.endDate = tempFormatter.dateFromString("11.08.2016 15:30")! //設置是否爲全天事件 event.allDay = false //設置事件的提醒時間(相對時間)提早15分鐘提醒 event.addAlarm(EKAlarm(relativeOffset: -60.0 * 15.0)) //設置事件的提醒時間(絕對時間) //event.addAlarm(EKAlarm(absoluteDate: NSDate(timeInterval: -60 * 15, sinceDate: event.startDate))) event.calendar = eventStore.defaultCalendarForNewEvents //保存事件,添加到日曆中 do { try eventStore.saveEvent(event, span: .ThisEvent, commit: true) } catch { } } }) }

3 分析:數據庫

  日曆分爲兩類,一類用於存儲事件的日曆,一類用於存儲提醒的日曆。數組

  EventKit庫框架受權訪問用戶的日曆app及提醒事項app。儘管是用兩個不一樣的應用來顯示用戶的日曆和提醒數據,但倒是同一個框架來維護這份數據。一樣地,存儲這份數據的數據庫叫作日曆數據庫,同時容納日曆和提醒信息。app

  事件庫不但容許你的應用獲取用戶已經存在的日曆及提醒數據,並且它可讓你的應用爲任何日曆建立新的事件和提醒。另外,事件庫讓用戶能夠編輯和刪除他們的事件和提醒(總體叫作「日曆項」)。若是日曆數據庫有來自你的應用外部的更改發生,事件庫能夠經過通知監測到,這樣你的應用能夠作出適當的響應。使用事件庫對日曆項所作的更改會自動地同步到相關的日曆。框架

(1)讀寫日曆數據庫異步

  你可使用 EKEventStore 類從用戶的日曆數據庫中獲取、建立、編輯和刪除事件。你能夠獲取匹配你提供的謂詞的事件自定義的一組事件,或經過惟一標識獲取一個單獨的事件。你獲取到一個事件後,可使用 EKEvent 類的屬性獲取訪問該事件相關的日曆信息。一樣的,你能夠經過設置 EKEvent 類的屬性來修改該事件的日曆信息。 async

  • 鏈接到事件庫
    在 iOS 5 及之後版本系統中,使用默認的初始化器:
    let eventStore = EKEventStore()

    在 iOS 6 及之後版本,你必須在事件庫初始化後,使用 requestAccessToEntityType:completion: 方法請求使用用戶的日曆數據庫。請求訪問某個實體類型會異步提示用戶容許或禁止你的應用使用他們的日曆信息。你應該處理用戶受權或禁止你的應用訪問權的各類情況:函數

    eventStore.requestAccessToEntityType(.Event) { (granted, error) in

    }

    EKEventStore 對象須要相對較大量的時間來初始化和釋放。所以,你不該該爲每個事件相關的任務都初始化和釋放事件庫。相反,在你的應用加載時,初始化一個事件庫,而後反覆地使用這一個來確保鏈接一直可用。事件庫實例不該該在其它事件開發包相對的對象釋放前被釋放,不然可能發生意想不到的狀態。ui

  • 獲取事件
    有兩種方式獲取事件。經過謂詞或搜索查詢獲取,會返回零個或多個與給定查詢匹配的事件。經過惟一標識獲取會返回與給定標識相符的惟一的一個事件。
    注意:從日曆數據庫獲取事件並不必定按時間順序返回。要經過日期排序 EKEvent 對象的數組,能夠在數組上調用 sortedArrayUsingSelector: 方法,並提供  compareStartDateWithEvent: 方法的選擇器。
  • 使用謂詞
    一般是要得到屬於某一日期範圍的事件。 EKEventStore 的 eventsMatchingPredicate: 方法獲取屬於你提供的謂詞中指定的日期範圍的全部事件。
    注意:儘管  eventsMatchingPredicate: 方法接受一個 NSPredicate類型的參數,但你必須提供一個用 EKEventStore 的方法 predicateForEventsWithStartDate:endDate:calendars: 建立的謂詞。
    你能夠指定一個日曆的子集來搜索,這須要傳遞一個 EKCalendar 對象的數組做爲 predicateForEventsWithStartDate:endDate:calendars: 方法的 calendars 參數。你能夠從事件庫的 calendarsForEntityType: 方法得到用戶的不一樣類型的日曆。若是傳一個 nil 值,那麼就是告訴這個方法獲取用戶的全部日曆。
    由於方法  eventsMatchingPredicate: 是同步的,而你可能並不想在你的應用主線程中運行它。若是要異步執行的話,那麼使用 dispatch_async 函數或使用一個 NSOperation 對象,就能夠在另外一個線程中運行該方法了。
  • 使用惟一標識
    若是你以前使用謂詞得到了一個事件並知道它的惟一標識,那麼你可使用 EKEventStore 的 eventWithIdentifier: 方法來再次獲取該事件。若是它是一個循環事件,那麼這個方法就會返回第一次出現的該事件。你可使用屬性 eventIdentifier 得到事件的惟一標識。
  • 建立及編輯事件
    使用 事件 EKEvent 的eventWithEventStore: 方法建立一個新的事件。
  • 保存和移除事件

    提示:若是你的應用修改用戶的日曆數據庫,它必須在這以前先從用戶得到確認。應用在未獲得用戶的特定指示的狀況下決不可能修改日曆數據庫。

    你對事件的修改不是持久化的,直到你保存它們爲止。使用 EKEventStore 的 saveEvent:span:commit:error: 方法保存你的修改到日曆數據庫中。若是你要從日曆數據庫移除事件,使用 EKEventStore 的 removeEvent:span:commit:error: 方法。不管你保存或移除事件,各自實現的方法都會自動所作的修改到該事件所屬於的日曆(CalDav、Exchange等等)。

    若是你保存一個循環事件,你能夠經過給 saveEvent:span:commit:error: 方法的參數 span 指定 EKSpanFutureEvents 來使你的更改應用到全部將來出現的該事件中。一樣地,你也能夠指定 removeEvent:span:commit:error: 方法的 span 參數值爲 EKSpanFutureEvents 來移除一個事件的全部將來的出現。

    注意:若是你給 commit 參數傳了 NO 值,那麼要確保稍侯調用 commit: 方法以持久保存你的更改(譯者注:默認傳 YES 會當即持久保存更改)。

參考連接:http://www.cnblogs.com/xiaobaichangan/p/5160025.html

相關文章
相關標籤/搜索