Xamarin.iOS'ta EventKit
iOS'ta takvimle ilgili iki uygulama yerleşik olarak bulunur: Takvim Uygulaması ve Anımsatıcılar Uygulaması. Takvim Uygulamasının takvim verilerini nasıl yönettiğini anlamak yeterlidir, ancak Anımsatıcılar Uygulaması daha az açıktır. Anımsatıcılar, son tarihler, ne zaman tamamlandıkları vb. bakımından onlarla ilişkilendirilmiş tarihlere sahip olabilir. Bu nedenle, iOS takvim olayları veya anımsatıcılar olsun tüm takvim verilerini Takvim Veritabanı adı verilen tek bir konumda depolar.
EventKit çerçevesi, Takvim Veritabanı'nın depolayan Takvimler, Takvim Olayları ve Anımsatıcılar verilerine erişmek için bir yol sağlar. iOS 4'ten bu yana takvimlere ve takvim etkinliklerine erişim sağlanmıştır, ancak anımsatıcılara erişim iOS 6'da yenidir.
Bu kılavuzda şu konuları ele alacağız:
- EventKit Basics – Bu, ana sınıflar aracılığıyla EventKit'in temel parçalarını tanıtır ve kullanımlarının anlaşılmasını sağlar. Belgenin sonraki bölümüyle başa çıkmadan önce bu bölümün okunması gerekir.
- Ortak Görevler – Ortak görevler bölümü, takvimleri listeleme, takvim olaylarını ve anımsatıcılarını oluşturma, kaydetme ve alma, ayrıca takvim olaylarını oluşturmak ve değiştirmek için yerleşik denetleyicileri kullanma gibi yaygın işlemlerin nasıl yapıldığına yönelik hızlı bir başvuru olarak tasarlanmıştır. Bu bölümün, belirli görevler için bir başvuru olması gerektiğinden, ön arkaya okunması gerekmez.
Bu kılavuzdaki tüm görevler yardımcı örnek uygulamada kullanılabilir:
Gereksinimler
EventKit, iOS 4.0'da tanıtıldı, ancak Anımsatıcılar verilerine erişim iOS 6.0'da tanıtıldı. Bu nedenle, genel EventKit geliştirmesi yapmak için anımsatıcılar için en az sürüm 4.0 ve 6.0'ı hedeflemeniz gerekir.
Buna ek olarak, Anımsatıcılar uygulaması simülatörde kullanılamaz, bu da anımsatıcı verilerinin de kullanılamayacağı anlamına gelir, ilk olarak siz eklemediğiniz sürece. Ayrıca, erişim istekleri yalnızca gerçek cihazda kullanıcıya gösterilir. Bu nedenle, EventKit geliştirme en iyi cihaz üzerinde test edilir.
Event Kit'in Temelleri
EventKit ile çalışırken ortak sınıfları ve kullanımlarını kavramak önemlidir. Bu sınıfların tümü ve EventKitUI
içinde EventKit
bulunabilir (içinEKEventEditController
).
EventStore
EventStore sınıfı, EventKit'te herhangi bir işlem gerçekleştirmesi gerektiğinden EventKit'teki en önemli sınıftır. Tüm EventKit verileri için kalıcı depolama veya veritabanı altyapısı olarak düşünülebilir. Hem EventStore
Takvim Uygulaması'ndaki takvimlere hem de takvim etkinliklerine ve Anımsatıcılar Uygulaması'ndaki anımsatıcılara erişiminiz vardır.
EventStore
Bir veritabanı altyapısı gibi olduğundan, uzun ömürlü olmalıdır, yani bir uygulama örneğinin ömrü boyunca mümkün olduğunca az oluşturulması ve yok edilmesi gerekir. Aslında, bir uygulamada bir EventStore
örneğini oluşturduktan sonra, yeniden ihtiyacınız olmayacağından emin değilseniz bu başvuruyu uygulamanın tüm ömrü boyunca tutmanız önerilir. Ayrıca, tüm çağrılar tek EventStore
bir örneğe gitmelidir. Bu nedenle tek bir örneği kullanılabilir durumda tutmak için Singleton deseni önerilir.
Olay Deposu Oluşturma
Aşağıdaki kod, sınıfın tek bir örneğini oluşturmanın ve bir uygulamanın içinden statik olarak kullanılabilir hale getirmenin EventStore
verimli bir yolunu gösterir:
public class App
{
public static App Current {
get { return current; }
}
private static App current;
public EKEventStore EventStore {
get { return eventStore; }
}
protected EKEventStore eventStore;
static App ()
{
current = new App();
}
protected App ()
{
eventStore = new EKEventStore ( );
}
}
Yukarıdaki kod, uygulama yüklendiğinde örneğini EventStore
örneklemek için Singleton desenini kullanır. EventStore
Daha sonra uygulamasına uygulama içinden aşağıdaki gibi genel olarak erişilebilir:
App.Current.EventStore;
Buradaki tüm örneklerin bu deseni kullandığını, bu nedenle aracılığıyla App.Current.EventStore
başvuruda bulunduklarını EventStore
unutmayın.
Takvim ve Anımsatıcı Verilerine Erişim İsteme
EventStore aracılığıyla herhangi bir veriye erişmesine izin verilmeden önce, bir uygulamanın ihtiyacınız olan takvim olay verilerine veya anımsatıcı verilerine erişim istemesi gerekir. Bunu kolaylaştırmak için, EventStore
çağrıldığında RequestAccess
kullanıcıya uygulamanın takvim verilerine veya iletilen anımsatıcı verilerine EKEntityType
erişim isteğinde bulunduğunu söyleyen bir uyarı görünümü gösterir. Bir uyarı görünümü oluşturacağından, çağrı zaman uyumsuzdur ve kendisine iki parametre (veya Lambda) olarak geçirilen bir NSAction
tamamlama işleyicisi çağırır; erişim verilip verilmediğini gösteren bir boole değeri ve null değilse istekte herhangi bir hata bilgisi içeren bir NSError
boole değeri alır. Örneğin, aşağıdaki kodlanmış takvim olayı verilerine erişim isteğinde bulunur ve istek verilmediyse bir uyarı görünümü gösterir.
App.Current.EventStore.RequestAccess (EKEntityType.Event,
(bool granted, NSError e) => {
if (granted)
//do something here
else
new UIAlertView ( "Access Denied",
"User Denied Access to Calendar Data", null,
"ok", null).Show ();
} );
İstek verildikten sonra, uygulama cihazda yüklü olduğu sürece hatırlanır ve kullanıcıya bir uyarı gösterilmez. Ancak, erişim yalnızca takvim olayları veya verilen anımsatıcılar olmak üzere kaynak türüne verilir. Bir uygulamanın her ikisine de erişmesi gerekiyorsa her ikisini de istemesi gerekir.
İzin hatırlandığından, her seferinde istekte bulunmak oldukça ucuzdur, bu nedenle bir işlemi gerçekleştirmeden önce her zaman erişim istemek iyi bir fikirdir.
Ayrıca, tamamlama işleyicisi ayrı bir (UI olmayan) iş parçacığında çağrıldığından, tamamlama işleyicisindeki kullanıcı arabirimindeki tüm güncelleştirmeler aracılığıyla InvokeOnMainThread
çağrılmalıdır, aksi takdirde bir özel durum oluşturulur ve yakalanmazsa uygulama kilitlenir.
EKEntityType
EKEntityType
, öğe veya veri türünü EventKit
açıklayan bir numaralandırmadır. İki değeri vardır: Event
ve Anımsatıcı. Erişim elde etmek veya almak için ne tür veriler olduğunu söylemek EventKit
de dahil olmak üzere EventStore.RequestAccess
bir dizi yöntemde kullanılır.
EKCalendar
EKCalendar , bir takvim olayı grubu içeren bir takvimi temsil eder. Takvimler yerel olarak, iCloud'da, Exchange Server veya Google gibi üçüncü taraf sağlayıcı konumunda vb. birçok farklı yerde depolanabilir. Çoğu zaman EKCalendar
olayların nerede aranacağı veya nereye kaydedileceği söylemek EventKit
için kullanılır.
EKEventEditController
EKEventEditController ad alanında EventKitUI
bulunabilir ve takvim olaylarını düzenlemek veya oluşturmak için kullanılabilecek yerleşik bir denetleyicidir. Yerleşik kamera denetleyicilerine çok benzer şekilde, EKEventEditController
kullanıcı arabirimini görüntüleme ve kaydetmeyi işleme konusunda ağır kaldırma işlemi sizin için yapar.
EKEvent
EKEvent bir takvim olayını temsil eder. Hem hem EKReminder
de EKEvent
öğesinden EKCalendarItem
devralın ve gibi Title
Notes
alanlara sahip olur.
EKReminder
EKReminder bir anımsatıcı öğesini temsil eder.
EKSpan
EKSpan , yinelenebilir olayları değiştirirken olayların aralığını açıklayan ve iki değeri olan bir numaralandırmadır: ThisEvent ve FutureEvents. ThisEvent
, herhangi bir değişikliğin yalnızca başvuruda bulunan serideki belirli bir olayda gerçekleşeceği, ancak FutureEvents
bu olayı ve gelecekteki tüm yinelemeleri etkileyeceği anlamına gelir.
Görevler
Kullanım kolaylığı için EventKit kullanımı, aşağıdaki bölümlerde açıklanan ortak görevlere ayrılmıştır.
Takvimleri Numaralandırma
Kullanıcının cihazda yapılandırdığı takvimleri listelemek için öğesini arayın GetCalendars
EventStore
ve almak istediğiniz takvimlerin türünü (anımsatıcılar veya etkinlikler) geçirin:
EKCalendar[] calendars =
App.Current.EventStore.GetCalendars ( EKEntityType.Event );
Yerleşik Denetleyiciyi Kullanarak Olay Ekleme veya Değiştirme
EkEventEditViewController, Takvim Uygulamasını kullanırken kullanıcıya sunulan kullanıcı arabirimiyle bir olay oluşturmak veya düzenlemek istiyorsanız, sizin için çok fazla ağır kaldırma işlemi yapar:
Bunu kullanmak için, bir yöntem içinde bildirdiği takdirde atık toplanmaması için bunu sınıf düzeyinde bir değişken olarak bildirmeniz gerekir:
public class HomeController : DialogViewController
{
protected CreateEventEditViewDelegate eventControllerDelegate;
...
}
Ardından başlatmak için örneği oluşturun, öğesine bir başvuru EventStore
verin, bir EKEventEditViewDelegate temsilcisi gönderin ve kullanarak PresentViewController
görüntüleyin:
EventKitUI.EKEventEditViewController eventController =
new EventKitUI.EKEventEditViewController ();
// set the controller's event store - it needs to know where/how to save the event
eventController.EventStore = App.Current.EventStore;
// wire up a delegate to handle events from the controller
eventControllerDelegate = new CreateEventEditViewDelegate ( eventController );
eventController.EditViewDelegate = eventControllerDelegate;
// show the event controller
PresentViewController ( eventController, true, null );
İsteğe bağlı olarak, olayı önceden doldurmak istiyorsanız, yepyeni bir olay oluşturabilir (aşağıda gösterildiği gibi) veya kaydedilmiş bir olayı alabilirsiniz:
EKEvent newEvent = EKEvent.FromStore ( App.Current.EventStore );
// set the alarm for 10 minutes from now
newEvent.AddAlarm ( EKAlarm.FromDate ( DateTime.Now.AddMinutes ( 10 ) ) );
// make the event start 20 minutes from now and last 30 minutes
newEvent.StartDate = DateTime.Now.AddMinutes ( 20 );
newEvent.EndDate = DateTime.Now.AddMinutes ( 50 );
newEvent.Title = "Get outside and exercise!";
newEvent.Notes = "This is your reminder to go and exercise for 30 minutes.”;
Kullanıcı arabirimini önceden doldurmak istiyorsanız denetleyicide Event özelliğini ayarladığınızdan emin olun:
eventController.Event = newEvent;
Mevcut bir olayı kullanmak için daha sonra Id ile Olay Alma bölümüne bakın.
Temsilci, kullanıcı iletişim kutusuyla bittiğinde denetleyici tarafından çağrılan yöntemi geçersiz kılmalıdır Completed
:
protected class CreateEventEditViewDelegate : EventKitUI.EKEventEditViewDelegate
{
// we need to keep a reference to the controller so we can dismiss it
protected EventKitUI.EKEventEditViewController eventController;
public CreateEventEditViewDelegate (EventKitUI.EKEventEditViewController eventController)
{
// save our controller reference
this.eventController = eventController;
}
// completed is called when a user eith
public override void Completed (EventKitUI.EKEventEditViewController controller, EKEventEditViewAction action)
{
eventController.DismissViewController (true, null);
}
}
}
İsteğe bağlı olarak, temsilcide eylemi değiştirmek ve yeniden kaydetmek için yöntemindeki Completed
Eylem'i denetleyebilirsiniz veya iptal edildiyse vb. başka şeyler yapabilirsiniz:
public override void Completed (EventKitUI.EKEventEditViewController controller, EKEventEditViewAction action)
{
eventController.DismissViewController (true, null);
switch ( action ) {
case EKEventEditViewAction.Canceled:
break;
case EKEventEditViewAction.Deleted:
break;
case EKEventEditViewAction.Saved:
// if you wanted to modify the event you could do so here,
// and then save:
//App.Current.EventStore.SaveEvent ( controller.Event, )
break;
}
}
Program Aracılığıyla Olay Oluşturma
Kodda bir olay oluşturmak için sınıfında FromStore fabrika yöntemini EKEvent
kullanın ve üzerindeki tüm verileri ayarlayın:
EKEvent newEvent = EKEvent.FromStore ( App.Current.EventStore );
// set the alarm for 10 minutes from now
newEvent.AddAlarm ( EKAlarm.FromDate ( DateTime.Now.AddMinutes ( 10 ) ) );
// make the event start 20 minutes from now and last 30 minutes
newEvent.StartDate = DateTime.Now.AddMinutes ( 20 );
newEvent.EndDate = DateTime.Now.AddMinutes ( 50 );
newEvent.Title = "Get outside and do some exercise!";
newEvent.Notes = "This is your motivational event to go and do 30 minutes of exercise. Super important. Do this.";
Olayın kaydedilmesini istediğiniz takvimi ayarlamanız gerekir, ancak tercihleriniz yoksa varsayılanı kullanabilirsiniz:
newEvent.Calendar = App.Current.EventStore.DefaultCalendarForNewEvents;
Olayı kaydetmek için üzerinde SaveEvent yöntemini çağırın:EventStore
NSError e;
App.Current.EventStore.SaveEvent ( newEvent, EKSpan.ThisEvent, out e );
Kaydedildikten sonra EventIdentifier özelliği, daha sonra olayı almak için kullanılabilecek benzersiz bir tanımlayıcıyla güncelleştirilir:
Console.WriteLine ("Event Saved, ID: " + newEvent.CalendarItemIdentifier);
EventIdentifier
, biçimlendirilmiş bir dize GUID'dir.
Program Aracılığıyla Anımsatıcı Oluşturma
Kodda anımsatıcı oluşturmak, takvim olayı oluşturmakla çok aynıdır:
EKReminder reminder = EKReminder.Create ( App.Current.EventStore );
reminder.Title = "Do something awesome!";
reminder.Calendar = App.Current.EventStore.DefaultCalendarForNewReminders;
Kaydetmek için üzerinde SaveReminder yöntemini çağırın:EventStore
NSError e;
App.Current.EventStore.SaveReminder ( reminder, true, out e );
Kimliğine Göre Olay Alma
Kimliğine göre bir olayı almak için üzerindeki EventFromIdentifier yöntemini kullanın ve olaydan çekilen öğesini geçirinEventIdentifier
:EventStore
EKEvent mySavedEvent = App.Current.EventStore.EventFromIdentifier ( newEvent.EventIdentifier );
Olaylar için iki tanımlayıcı özelliği daha vardır, ancak EventIdentifier
bu özellik için çalışan tek özelliktir.
Kimliğine Göre Anımsatıcı Alma
Anımsatıcı almak için üzerinde GetCalendarItem yöntemini kullanın ve CalendarItemIdentifier'ı geçirin:EventStore
EKCalendarItem myReminder = App.Current.EventStore.GetCalendarItem ( reminder.CalendarItemIdentifier );
bir GetCalendarItem
EKCalendarItem
döndürdüğünden, anımsatıcı verilerine erişmeniz veya örneği daha sonra kullanmak EKReminder
istiyorsanız bu verinin 'e EKReminder
yayınlanması gerekir.
Yazma sırasında olduğu gibi takvim olayları için kullanmayın GetCalendarItem
, çalışmaz.
Olay Silme
Bir takvim olayını silmek için, üzerinde EventStore
RemoveEvent'i çağırın ve olaya ve uygun EKSpan
olan öğesine bir başvuru gönderin:
NSError e;
App.Current.EventStore.RemoveEvent ( mySavedEvent, EKSpan.ThisEvent, true, out e);
Ancak, bir olay silindikten sonra olay başvurusu olur null
.
Anımsatıcı Silme
Anımsatıcıyı silmek için, üzerinde EventStore
RemoveReminder'ı çağırın ve anımsatıcıya bir başvuru iletin:
NSError e;
App.Current.EventStore.RemoveReminder ( myReminder as EKReminder, true, out e);
Yukarıdaki kodda, öğesini almak için EKReminder
GetCalendarItem
kullanıldığından öğesine bir atama olduğunu unutmayın.
Olaylar aranıyor
Takvim olaylarını aramak için üzerindeki PredicateForEvents yöntemi EventStore
aracılığıyla bir NSPredicate nesnesi oluşturmanız gerekir. , NSPredicate
iOS'un eşleşmeleri bulmak için kullandığı bir sorgu veri nesnesidir:
DateTime startDate = DateTime.Now.AddDays ( -7 );
DateTime endDate = DateTime.Now;
// the third parameter is calendars we want to look in, to use all calendars, we pass null
NSPredicate query = App.Current.EventStore.PredicateForEvents ( startDate, endDate, null );
öğesini oluşturduktan NSPredicate
sonra üzerinde EventStore
EventsMatching yöntemini kullanın:
// execute the query
EKCalendarItem[] events = App.Current.EventStore.EventsMatching ( query );
Sorguların zaman uyumlu (engelleyici) olduğunu ve sorguya bağlı olarak uzun sürebileceğini unutmayın, bu nedenle bunu yapmak için yeni bir iş parçacığı veya görev oluşturmak isteyebilirsiniz.
Anımsatıcıları Arama
Anımsatıcıları aramak olaylara benzer; bir koşul gerektirir, ancak çağrı zaten zaman uyumsuzdur, bu nedenle iş parçacığını engelleme konusunda endişelenmeniz gerekmez:
// create our NSPredicate which we'll use for the query
NSPredicate query = App.Current.EventStore.PredicateForReminders ( null );
// execute the query
App.Current.EventStore.FetchReminders (
query, ( EKReminder[] items ) => {
// do someting with the items
} );
Özet
Bu belgede hem EventKit çerçevesinin önemli parçalarına hem de en yaygın görevlere genel bir bakış vermiştir. Ancak EventKit çerçevesi çok büyük ve güçlüdür ve burada kullanılmamış özellikler içerir: toplu güncelleştirmeler, alarmları yapılandırma, etkinliklerde yinelenmeyi yapılandırma, takvim veritabanında değişiklikleri kaydetme ve dinleme, GeoFences ve daha fazlasını ayarlama. Daha fazla bilgi için bkz. Apple'ın Takvim ve Anımsatıcılar Programlama Kılavuzu.