Share via


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:

Yardımcı örnek uygulama ekranları

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.EventStorebaş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 NSErrorboole 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 TitleNotesalanlara 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 GetCalendarsEventStore 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:

Takvim Uygulaması kullanılırken kullanıcıya sunulan kullanıcı arabirimi

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 EventStoreverin, bir EKEventEditViewDelegate temsilcisi gönderin ve kullanarak PresentViewControllergö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 GetCalendarItemEKCalendarItemdö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 EKSpanolan öğ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 EKReminderGetCalendarItem kullanıldığından öğesine bir atama olduğunu unutmayın.

Olaylar aranıyor

Takvim olaylarını aramak için üzerindeki PredicateForEvents yöntemi EventStorearacı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 NSPredicatesonra üzerinde EventStoreEventsMatching 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.