From:http://docs.xamarin.com/guides/ios/platform_features/introduction_to_eventkit/ html
本教程展現了對於如何經過EventKit訪問和使用存儲在日曆數據庫(Calendar Database)中的日曆(Calendars)、日曆事件(CalendarEvents)和提醒的概述。而且講述了重要的類(Class)還有他們的在編程中的用法,固然還有一些有關EventKit框架的經常使用任務。ios
概述數據庫
iOS有兩個內建的日曆應用:Calendar,Reminders。很顯然能看出Calendar是管理日曆數據的,而Reminders卻不是特別顯而易見。Reminders擁有在指定時間安排、完成等等的事件的日期。好比,iOS存儲着全部的日曆數據,不管它屬於日曆事件(calendar events)或者提醒(reminders),他們都屬於日曆數據庫(Calendar Database)。編程
EventKit框架提供了一種訪問存儲在日曆數據庫(Calendar Database)的日曆、日曆事件、提醒數據的方式。iOS4開始就支持訪問日曆和日曆事件、而iOS6起增長支持訪問提醒。緩存
這個教程咱們包含下面內容:app
教程中得全部任務都有例子:框架
必要條件異步
EventKit是在iOS4.0提出的,但訪問提醒(Reminders)是在iOS6中提出。這樣的話,一般作EventKit 開發,使用日曆要基於iOS4.0,提醒須要基於iOS6。ide
另外,Reminders應用程序不適用於模擬器,這意味着提醒數據是不能夠用的,除非你先添加了他們。還有,訪問請求(assess requests)只在真實設備上展現給用戶。這樣的話,EventKit開發要基於真實設備來測試。測試
Event Kit 基礎
當咱們使用EventKit的時候,重要的是掌握經常使用類和他們的用法。全部的類(Class)均可以在MonoTouch.EventKit 和 MonoTouch.EventKitUI(for the EKEventEditController)中找到.
EventStore
EventStore是EventKit中最重要的類,由於在EventKit中執行的任何操做都須要它。EventStore能夠認爲是 持久存儲器 或者 數據庫,EventKit數據的引擎。從EventStore中,你能夠訪問到Calendar應用程序中得日曆還有日曆事件,固然還有Reminders應用中得提醒。
由於EventStore很像一個數據庫引擎,因此他應該長久持有,這意味着在應用的生命週期內它應該儘量的少建立、銷燬。實際,建議這樣:一旦你在應用中建立了一個EventStore,你應該在應用的生命週期內保持它(EventStore)的引用,除非你肯定你再不使用它了。另外,全部的調用都針對魚一個EventStore實例。因此呢,推薦單例模式。
Creating an Event Store
下面的代碼,說明了一個簡單而有效方式建立一個EventStore的單例,使它在應用中靜態存在。
1 public class App 2 { 3 public static App Current { 4 get { return current; } 5 } 6 private static App current; 7 8 public EKEventStore EventStore { 9 get { return eventStore; } 10 } 11 protected EKEventStore eventStore; 12 13 static App () 14 { 15 current = new App(); 16 } 17 protected App () 18 { 19 eventStore = new EKEventStore ( ); 20 } 21 }
上面的代碼在應用加載的時候 使用了單例模式實現了EventStore對象。這個對象可以全局的訪問,像這樣:
App.Current.EventStore;
請求 日曆 和 提醒 數據
在容許經過EventStore訪問任何數據以前,應用程序必須首先獲取權限,不管日曆事件(calendar event)仍是 提醒數據(reminders data),取決於你。爲此,EventStore暴露了一個方法RequestAccess,當調用它的時候,系統會彈出一個提示框給用戶,告訴用戶應用程序請求訪問日曆數據或者提醒數據。由於有提示框,因此這個調用是異步的,而且完成後會有一個帶兩個參數(一個bool類型的granted和 NSError)的回調被調用,指出是否獲取到權限訪問。
下面代碼就是請求權限訪問日曆事件:
1 App.Current.EventStore.RequestAccess (EKEntityType.Event, 2 (bool granted, NSError e) => { 3 if (granted) 4 //do something here 5 else 6 new UIAlertView ( "Access Denied", "User Denied Access to Calendar Data", null,"ok", null).Show (); 7 } );
一旦請求被容許,這個應用只要安裝在設備上,那麼就不會在被彈出再提示。可是,權限只是容許訪問給出的資源類型,是日曆事件或提醒。若是一個應用須要這兩種都能訪問,那就都要請求。
由於權限是被緩存的了,那麼每次請求相對輕鬆,因此在每一個操做以前都請求權限是個不錯的主意。
另外,由於回調方法是在非UI線程中調用的,因此全部更新UI得操做都要在Main Thread調用,不然就會引起異常。
EKEntityType
這是個描述EventKit或者數據的類型 的枚舉類型,它有兩個值:Event、Reminder。它在不少方法中被使用,包括EventStore的RequestAccess方法,告訴EventKit要獲取什麼類型的數據權限。
EKCalendar
EKCalendar至關於一個日曆,包含了一組日曆事件,日曆可以存儲在不少地方,例如 本地、iCloud、第三方商:Exchange Sever 或者Google。大多時候,EKCalendar被用來告知EventKit,事件從何查找,存儲到哪裏。
EKEventEditController
EKEventEditController可以在MonoTouch.EventKitUI中找到,它是個內建的控制器,用於建立修改日曆事件。這很像內建的相機控制器,EKEventEditController幫你作了繁重的UI和保存數據的工做。
EKEvent
EKEvent至關於一個日曆,不論是EKEvent仍是EKReminder都繼承於EKCalendarItem,他們都有Title、Notes等字段。
EKReminder
EKReminder至關於一個提醒事項。
EKSpan
EKSpan是個當修改事件爲可重複的時候用於描述事件的跨度的枚舉值,它有兩個值:ThisEvent、FutureEvents。ThisEvent意味着任何改變,只會發生在被引用的一系列特定事件,而FutureEvents會影響事件和全部將來的復發。
Tasks
都是代碼了,參照原文
還有Apple的Guide
https://developer.apple.com/library/prerelease/ios/documentation/DataManagement/Conceptual/EventKitProgGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40009765