Xamarin.iOS'ta EventKit
iOS'ta takvimle ilgili yerleşik iki uygulama vardır: Takvim Uygulaması ve Anımsatıcılar Uygulaması. Takvim Uygulamasının takvim verilerini nasıl yöneteceklerini anlamak oldukça kolaydır ancak Anımsatıcılar Uygulaması daha az belirgindir. Anımsatıcılar, son tarihler, tamamlanma zamanları vb. açısından kendileriyle ilişkilendirilmiş tarihlere sahip olabilir. Bu nedenle iOS, takvim olayları veya anımsatıcılar gibi tüm takvim verilerini Takvim Veritabanı adlı tek bir konumda depolar.
EventKit çerçevesi Takvim Veritabanı'nın depoları olan 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 olaylarına erişim mevcuttur, ancak iOS 6'da anımsatıcılara erişim yenidir.
Bu kılavuzda şunları kapsıyoruz:
- EventKit Temel Bilgileri – Bu, eventKit'in temel parçalarını ana sınıflar aracılığıyla tanıtacak ve kullanımlarını anlamalarını sağlar. Bu bölüm, belgenin sonraki bölümüyle ilgili bir adıma varmadan önce okunması gerekir.
- Ortak Görevler – Ortak görevler bölümü, aşağıdakiler gibi yaygın şeyleri nasıl gerçekleştireceğime yönelik hızlı bir başvuru olarak tasarlanmıştır: takvimleri numaralama, takvim olaylarını ve anımsatıcıları oluşturma, kaydetme ve alma ile takvim olaylarını oluşturmak ve değiştirmek için yerleşik denetleyicileri kullanma. Bu bölüm, belirli görevler için bir başvuru olduğu için önden geriye doğru okunma ihtiyacı değildir.
Bu kılavuzda yer alan 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'a ve 6.0'a hedeflemeniz gerekir.
Buna ek olarak, Anımsatıcılar uygulaması simülatörde kullanılamaz; bu da anımsatıcılar verilerini ilk siz eklemedikçe de kullanılabilir olmadığı anlamına gelir. Buna ek olarak, erişim istekleri yalnızca gerçek cihazda kullanıcıya gösterilir. Bu nedenle, EventKit geliştirme en iyi şekilde Cihazda test edilir.
Event Kit Temel Bilgileri
EventKit ile çalışırken ortak sınıfları ve bunların kullanımını kavramak önemlidir. Bu sınıfların hepsi ve içinde EventKitEventKitUI bulunabilir EKEventEditController (için).
EventStore
EventStore sınıfı EventKit'te herhangi bir işlemi gerçekleştirmek için gerekli olduğundan EventKit'te en önemli sınıftır. Tüm EventKit verileri için kalıcı depolama veya veritabanı altyapısı olarak düşünebilirsiniz. Hem Takvim Uygulamasındaki takvimlere hem de takvim etkinliklerine ve Anımsatıcılar EventStore Uygulamasındaki anımsatıcılara erişebilirsiniz.
bir veritabanı altyapısı gibi olduğundan, uzun süreli olmalıdır, yani bir uygulama örneğinin ömrü boyunca mümkün olduğunca az bir şekilde oluşturularak EventStore yok edilir. Aslında, bir uygulamada bir örneği oluşturdukta, bir daha ihtiyacınız olmayacaksa bu başvurunun uygulamanın tüm ömrü boyunca bu başvurunun etrafında EventStore tutmanız önerilir. buna ek olarak, tüm çağrılar tek bir örneğine EventStore gitmeli. 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çinde statik olarak kullanılabilir hale EventStore getirirken etkili bir yolu göstermektedir:
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, uygulamanın yükserken bir örneğini örneği için Singleton EventStore desenini kullanır. Daha EventStore sonra aşağıdaki gibi uygulamanın içinde genel olarak erişilebilir:
App.Current.EventStore;
Buradaki tüm örneklerde bu desenin kullanıla, bu nedenle aracılığıyla başvurusu olduğunu EventStoreApp.Current.EventStore unutmayın.
Takvim ve Anımsatıcı Verilerine Erişim İsteği
EventStore aracılığıyla herhangi bir veriye erişmesine izin verilmeden önce, bir uygulamanın ihtiyacınız olan takvim olayları verilerine veya anımsatıcılar verilerine erişim isteğinde olması gerekir. Bunu kolaylaştırmak için , kullanıcıya uygulamanın takvim verilerine veya anımsatıcı verilerine erişim isteğinde bulunduğunuzu ve buna geçirilene bağlı olarak kullanıcıya bir uyarı görünümü gösterecek adlı bir yöntemi EventStoreRequestAccessEKEntityType gösterir. Bir uyarı görünümü tetikleyene, çağrı zaman uyumsuz olduğundan ve iki parametre alacak bir (veya Lambda) olarak geçirilen bir tamamlama işleyicisini çağıracak; erişim verilip verilmese de boole değeri ve (null ise istekte hata bilgisi NSActionNSError içerir). Örneğin, aşağıdaki kodlu takvim olay verilerine erişim isteğinde edek ve istek verilmedi ise 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ırlanacak ve kullanıcıya uyarı verilmez. Ancak, erişim yalnızca takvim olayları veya verilen anımsatıcılar gibi kaynak türüne verilir. Bir uygulamanın her iki uygulamaya da erişmesi gerekirse her ikisini de isteğine sahip olması gerekir.
İzin anımsanmış olduğundan, isteği her zaman yapmak görece ucuzdur, bu nedenle bir işlem gerçekleştirmeden önce her zaman erişim isteğide olmak iyi bir fikirdir.
Ayrıca, tamamlama işleyicisi ayrı (UI olmayan) bir iş parçacığında çağrıldı olduğundan, tamamlama işleyicisinde kullanıcı arabirimine yapılan tüm güncelleştirmeler aracılığıyla çağrılırsa, aksi takdirde bir özel durum meydana gelir ve yakalanmazsa InvokeOnMainThread uygulama çökecek.
EKEntityType
EKEntityType , öğe veya veri türünü açıklayan bir EventKit numaralamadı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 de EventStore.RequestAccess dahil olmak üzere çeşitli EventKit yöntemlerde kullanılır.
EKCalendar
EKCalendar, bir takvim olayları grubunu içeren bir takvimi temsil eder. Takvimler yerel olarak, iCloud'da, Exchange Serverveya Googlegibi 3. taraf sağlayıcı konumlarında vb. farklı yerlerde depolanıyor olabilir. Birçok kez olayları nereye bakacağız veya nereye kaydedilebileceklerini söylemek için kullanılır.
EKEventEditController
EKEventEditController ad alanı içinde bulunabilir ve takvim olaylarını düzenlemek veya oluşturmak için kullanılan yerleşik bir denetleyicidir. Yerleşik kamera denetleyicilerine çok benzer şekilde, kullanıcı arabirimini görüntüleme ve kaydetmeyi işleme konusunda ağır EKEventEditController iş yapar.
EKEvent
EKEvent bir takvim olayı temsil eder. hem EKEvent hem EKReminder de devralın ve , ve gibi EKCalendarItem alanlara TitleNotes sahiptir.
EKReminder
EKReminder bir anımsatıcı öğesini temsil eder.
EKSpan
EKSpan, tekrarlayan olayları değiştirirken olayların yayma sürelerini açıklayan ve iki değere sahip olan bir numaralamadır: ThisEvent ve FutureEvents. ThisEvent , tüm değişikliklerin yalnızca başvurulan serideki belirli bir olayda meydana geleceği, ancak bu olayı ve gelecekteki tüm FutureEvents yinelemeleri etkileyeceğini ifade ediyor.
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 Numarala
Kullanıcının cihazda yapılandırmış olduğu takvimleri numaralara almak için üzerinde çağrısı ve almak istediğiniz takvim türünü (anımsatıcılar veya GetCalendarsEventStore olaylar) iletir:
EKCalendar[] calendars =
App.Current.EventStore.GetCalendars ( EKEntityType.Event );
Yerleşik Denetleyiciyi Kullanarak Olay Ekleme veya Değiştirme
EkEventEditViewController, Takvim Uygulaması kullanırken kullanıcıya sunulan kullanıcı arabirimiyle bir olay oluşturmak veya düzenlemek için çok fazla iş yapar:
Bunu kullanmak için sınıf düzeyinde bir değişken olarak bildirebilirsiniz; böylece bir yöntem içinde bildirilen atık toplamayı aldırmaz:
public class HomeController : DialogViewController
{
protected CreateEventEditViewDelegate eventControllerDelegate;
...
}
Ardından, başlatmak için: örneği başlatmak, buna bir başvuru EventStore vermek, EventStore temsilcisini ona havale etmek ve kullanarak görüntülemek PresentViewController için:
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 için yepyeni bir olay oluşturabilir (aşağıda gösterildiği gibi) veya kaydedilmiş bir olayı edinebilirsiniz:
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 isterseniz denetleyicide Event özelliğini ayarlamayı unutmayın:
eventController.Event = newEvent;
Mevcut bir olayı kullanmak için daha sonra Kimliğine göre Olay Alma bölümüne bakın.
Temsilci, kullanıcı iletişim Completed kutusuyla tamamlandığında denetleyici tarafından çağrılan yöntemini geçersiz kılmalı:
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, olayı değiştirmek ve yeniden kaydetmek veya iptal edilmişse başka şeyler yapmak için yönteminde Eylem'i kontrol edin, etcetera:
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 factory yöntemini kullanın ve üzerinde herhangi bir veri 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 kayıtlı olması istediğiniz takvimi ayarlayabilirsiniz, ancak tercihleriniz yoksa varsayılanı kullanabilirsiniz:
newEvent.Calendar = App.Current.EventStore.DefaultCalendarForNewEvents;
Olayı kaydetmek için üzerinde SaveEvent yöntemini arayın:
NSError e;
App.Current.EventStore.SaveEvent ( newEvent, EKSpan.ThisEvent, out e );
Kaydedildikten sonra EventIdentifier özelliği, daha sonra olayı almak için kullanılan benzersiz bir tanımlayıcıyla güncelleştirilir:
Console.WriteLine ("Event Saved, ID: " + newEvent.CalendarItemIdentifier);
EventIdentifier , dize biçimlendirilmiş bir GUID'tir.
Program Aracılığıyla Anımsatıcı Oluşturma
Kodda anımsatıcı oluşturmak, takvim olayı oluşturmakla hemen hemen 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 arayın:
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 üzerinde EventFromIdentifier yöntemini kullanın ve olaydan alınan olayı EventIdentifier iletir:
EKEvent mySavedEvent = App.Current.EventStore.EventFromIdentifier ( newEvent.EventIdentifier );
Olaylar için iki başka tanımlayıcı özelliği daha vardır, EventIdentifier ancak bu özellik için tek çalışan özelliktir.
Kimlikle Anımsatıcı Alma
Anımsatıcı almak için üzerinde GetCalendarItem yöntemini kullanın ve CalendarItemIdentifier'a iletirsiniz:
EKCalendarItem myReminder = App.Current.EventStore.GetCalendarItem ( reminder.CalendarItemIdentifier );
bir GetCalendarItem döndür EKCalendarItem olduğundan, anımsatıcı verilerine erişmeniz veya örneği daha sonra kullanmak için bu veri EKReminder kaynağına EKReminder atılması gerekir.
Takvim olayları için yazmayın, bu sırada GetCalendarItem çalışmıyor.
Olay Silme
Bir takvim olayı silmek için, üzerinde RemoveEvent'i çağırarak etkinliğe ve uygun bir başvuruya geçişin: EKSpan
NSError e;
App.Current.EventStore.RemoveEvent ( mySavedEvent, EKSpan.ThisEvent, true, out e);
Ancak, bir olay silindikten sonra olay başvurusu null olur.
Anımsatıcı Silme
Bir anımsatıcıyı silmek için üzerinde RemoveReminder'ı çağırarak anımsatıcıya bir başvuru silin:
NSError e;
App.Current.EventStore.RemoveReminder ( myReminder as EKReminder, true, out e);
Yukarıdaki kodda, bunu almak için kullanılan için EKReminder için bir döküm olduğunu GetCalendarItem unutmayın
Olayları Arama
Takvim olaylarını aramak için, üzerinde PredicateForEvents yöntemi 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 );
oluşturduktan sonra NSPredicate üzerinde NSPredicate yöntemini EventStore kullanın:
// execute the query
EKCalendarItem[] events = App.Current.EventStore.EventsMatching ( query );
Sorguların zaman uyumlu (engelleme) olduğunu ve sorguya bağlı olarak uzun zaman alsa da bunu yapmak için yeni bir iş parçacığı veya görev oluşturmak gerektirebilirsiniz.
Anımsatıcılar Için Arama
Anımsatıcılar aramak olaylara benzer; bir gereklilik gerektirir, ancak çağrı zaten zaman uyumsuz olduğu için iş parçacığını engelleme konusunda endişelenmenize gerek yok:
// 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örevlerin bir diziye genel bakışa yer vedi. Ancak EventKit çerçevesi çok büyük ve güçlü bir çerçevedir ve burada henüz tanıtılmış olan toplu güncelleştirmeler, alarmları yapılandırma, olaylar üzerinde yinelenmeyi yapılandırma, takvim veritabanındaki değişiklikleri kaydetme ve dinleme, GeoFences ve daha fazlasını ayarlama gibi özellikler içerir. Daha fazla bilgi için bkz. Apple Takvim ve Anımsatıcılar Programlama Kılavuzu.

