EventKitu v Xamarin. iOS

systém iOS má vestavěnou dvě aplikace související s kalendáři: aplikace kalendáře a aplikace s připomenutími. Je dostatečně jasné, abyste pochopili, jak aplikace kalendáře spravuje data kalendáře, ale aplikace s připomenutími není méně zřejmá. K připomenutím můžou být ve skutečnosti přidružená data z hlediska jejich splnění, pokud jsou dokončená atd. V takovém případě iOS ukládá všechna data kalendáře, ať už jde o události v kalendáři nebo připomenutí, v jednom umístění, které se nazývá databáze kalendáře.

EventKitu Framework poskytuje způsob, jak získat přístup k kalendářům, událostem kalendářea datům připomenutí , které ukládá kalendář databáze. Přístup k kalendářům a událostem kalendáře byl k dispozici od verze iOS 4, ale přístup k připomenutím je v systému iOS 6 novinkou.

V této příručce se pokryje:

  • Základy EventKitu – to přináší základní části EventKitu prostřednictvím hlavních tříd a poskytuje porozumění jejich využití. Tato část je povinná pro čtení, než se pustíte do další části dokumentu.
  • Běžné úlohy – část běžné úlohy je určena jako rychlá referenční příručka, jak provádět běžné věci, jako je například; vytváření výčtu kalendářů, vytváření, ukládání a načítání událostí a připomenutí kalendáře a používání integrovaných řadičů pro vytváření a úpravu událostí kalendáře. Tento oddíl není nutné číst zepředu po obnovení, protože se jedná o odkaz pro konkrétní úkoly.

Všechny úlohy v této příručce jsou k dispozici v doprovodné ukázkové aplikaci:

Doprovodné obrazovky s ukázkovou aplikací

Požadavky

EventKitu se zavedla v iOS 4,0, ale přístup k datům připomenutí byl představený v iOS 6,0. V takovém případě pro obecné EventKitu vývoj budete muset pro připomenutí cílit alespoň na verzi 4,0 a 6,0.

Kromě toho aplikace připomenutí není v simulátoru k dispozici, což znamená, že data připomenutí nebudou k dispozici, pokud je nepřidáte jako první. Žádosti o přístup se navíc zobrazují jenom uživateli na skutečném zařízení. V takovém případě je vývoj EventKitu nejlépe testován na zařízení.

Základy pro sadu Event Kit

Při práci s EventKitu je důležité mít k dispozici všechny společné třídy a jejich využití. Všechny tyto třídy lze nalézt v EventKit a EventKitUI (pro EKEventEditController ).

Eventstoru

Třída eventstoru je nejdůležitější třídou v EventKitu, protože je nutné provést všechny operace v EventKitu. Lze si představit jako trvalé úložiště nebo databázový stroj pro všechna EventKitu data. Od EventStore vás máte přístup k kalendářům a událostem kalendáře v aplikaci kalendáře i k připomenutím v aplikaci připomenutí.

Vzhledem k tomu EventStore , že se jako databázový stroj, měl by být dlouhotrvající, což znamená, že by měl být vytvořen a zničen co nejmenším možným způsobem během životnosti instance aplikace. Doporučuje se, abyste po vytvoření jedné instance aplikace EventStore v aplikaci zanechali tento odkaz na celou dobu životnosti aplikace, pokud si nejste jisti, že ji nebudete potřebovat znovu. Kromě toho by všechna volání měla jít na jednu EventStore instanci. Z tohoto důvodu se doporučuje vzor singleton, aby bylo možné udržovat jedinou instanci.

Vytváření úložiště událostí

Následující kód ilustruje účinný způsob, jak vytvořit jednu instanci EventStore třídy a zpřístupnit ji staticky v rámci aplikace:

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 ( );
    }
}

Výše uvedený kód používá ke konkretizaci instance EventStore při načtení aplikace vzor singleton. V EventStore rámci aplikace lze potom použít globálně, jak je znázorněno níže:

App.Current.EventStore;

Všimněte si, že všechny příklady v tomto příkladu používají tento model, takže na něj odkazují EventStoreApp.Current.EventStore .

Požaduje se přístup k datům kalendáře a připomenutí.

Aby bylo možné získat přístup k datům přes Eventstoru, musí aplikace nejprve požádat o přístup k datům událostí kalendáře nebo k datům připomenutí v závislosti na tom, který z nich potřebujete. Pro usnadnění tohoto prvku EventStore zpřístupňuje metoda, která je volána, RequestAccess když je volána – zobrazí zobrazení výstrahy uživateli, že aplikace požaduje přístup k datům v kalendáři, nebo data připomenutí v závislosti na tom, která z nich EKEntityType je předána. Vzhledem k tomu, že vyvolává zobrazení výstrah, je volání asynchronní a volání obslužné rutiny dokončení předané jako NSAction (nebo lambda) k tomuto objektu, který získá dva parametry; logická hodnota, bez ohledu na udělení přístupu, a a NSError , která, pokud hodnota not-null, bude v požadavku obsahovat jakékoli informace o chybě. Například následující kód bude vyžadovat přístup k datům události kalendáře a zobrazit zobrazení výstrah, pokud požadavek nebyl udělen.

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 ();
            } );

Po udělení žádosti se zapamatuje, dokud se aplikace nainstaluje do zařízení a neotevře se uživateli výstraha. Přístup je však poskytován pouze pro typ prostředku, buď jsou události kalendáře nebo připomenutí udělena. Pokud aplikace potřebuje přístup k oběma, měla by vyžadovat obě.

Vzhledem k tomu, že oprávnění je zapamatování, je poměrně levné na to, aby se povedl požadavek pokaždé, takže před provedením operace je vhodné vždy požádat o přístup.

Vzhledem k tomu, že obslužná rutina dokončení je volána na samostatném vlákně (bez uživatelského rozhraní), všechny aktualizace uživatelského rozhraní v obslužné rutině dokončení by měly být volány prostřednictvím InvokeOnMainThread , jinak bude vyvolána výjimka a pokud není zachycena, aplikace dojde k chybě.

EKEntityType

EKEntityType je výčet, který popisuje typ EventKit položky nebo data. Má dvě hodnoty: Event a připomenutí. Používá se v mnoha metodách, včetně informací o EventStore.RequestAccess tom, EventKit Jaký druh dat má získat přístup k nebo načíst.

EKCalendar

EKCalendar představuje kalendář, který obsahuje skupinu událostí kalendáře. kalendáře se můžou ukládat na hodně různých místech, jako je například místně, v iCloudna umístění poskytovatele třetí strany, jako je například Exchange Server nebo Googleatd. V mnoha případech se používá k oznámení , kde hledat události nebo kam je uložit.

EKEventEditController

EKEventEditController lze nalézt v oboru názvů a je vestavěným kontrolérem, který lze použít k úpravě nebo vytvoření událostí kalendáře. Podobně jako u vestavěných řadičů kamery EKEventEditController dělá těžké zvedání v zobrazení uživatelského rozhraní a manipulace s uložením.

EKEvent

EKEvent představuje událost kalendáře. EKEventA EKReminder dědí z EKCalendarItem a pole, jako například Title , Notes a tak dále.

EKReminder

EKReminder představuje položku připomenutí.

EKSpan

EKSpan je výčet, který popisuje rozsah událostí při změně událostí, které se mohou opakovat, a má dvě hodnoty: ThisEvent a FutureEvents. ThisEvent znamená, že všechny změny budou provedeny pouze pro konkrétní událost v řadě, na kterou se odkazuje, zatímco FutureEvents Tato událost a všechna budoucí opakování budou mít vliv.

Úkoly

Pro snadné použití EventKitu využití bylo rozdělené do běžných úloh, které jsou popsané v následujících částech.

Zobrazení výčtu kalendářů

Chcete-li vytvořit výčet kalendářů, které uživatel nakonfiguroval na zařízení, zavolejte na GetCalendarsEventStore a předejte typ kalendářů (připomenutí nebo události), které chcete přijmout:

EKCalendar[] calendars = 
App.Current.EventStore.GetCalendars ( EKEntityType.Event );

Přidání nebo úprava události pomocí integrovaného kontroleru

EKEventEditViewController má spoustu těžkého zvedání, pokud chcete vytvořit nebo upravit událost se stejným uživatelským rozhraním, které se uživateli zobrazí při použití aplikace kalendáře:

Uživatelské rozhraní, které se uživateli zobrazí při použití aplikace kalendáře

Chcete-li jej použít, je třeba jej deklarovat jako proměnnou na úrovni třídy, aby nezískala uvolňování paměti, pokud je deklarována v rámci metody:

public class HomeController : DialogViewController
{
        protected CreateEventEditViewDelegate eventControllerDelegate;
        ...
}

Pak ji můžete spustit: vytvořte její odkaz na, zakažte na EventStore ni delegáta EventStore a pak ji zobrazte pomocí PresentViewController :

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 );

Případně, pokud chcete událost předem naplnit, můžete buď vytvořit novou událost (jak je vidět níže), nebo můžete načíst uloženou událost:

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.”;

Pokud chcete uživatelské rozhraní předem naplnit, nezapomeňte nastavit vlastnost události na řadiči:

eventController.Event = newEvent;

Pokud chcete použít existující událost, přečtěte si část jak načíst událost podle ID později.

Delegát by měl přepsat Completed metodu, která je volána řadičem, když je uživatel dokončen v dialogovém okně:

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);
                }
        }
}

V případě potřeby můžete v delegátu zaškrtnout akci v metodě pro úpravu události a znovu uložit nebo provést jiné akce, pokud je zrušena, 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;
        }
}

Programové vytvoření události

Chcete-li vytvořit událost v kódu, použijte pro třídu metodu Factory FromStore a nastavte na ni všechna data:

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.";

Je nutné nastavit kalendář, ve kterém má být událost uložena, ale pokud nemáte žádné předvolby, můžete použít výchozí:

newEvent.Calendar = App.Current.EventStore.DefaultCalendarForNewEvents;

Chcete-li uložit událost, zavolejte metodu SaveEvent na :

NSError e;
App.Current.EventStore.SaveEvent ( newEvent, EKSpan.ThisEvent, out e );

Po uložení bude vlastnost EventIdentifier aktualizována jedinečným identifikátorem, který lze později použít k načtení události:

Console.WriteLine ("Event Saved, ID: " + newEvent.CalendarItemIdentifier);

EventIdentifier je identifikátor GUID formátu řetězce.

Programové vytvoření připomenutí

Vytvoření připomenutí v kódu je mnohem stejné jako vytvoření události kalendáře:

EKReminder reminder = EKReminder.Create ( App.Current.EventStore );
reminder.Title = "Do something awesome!";
reminder.Calendar = App.Current.EventStore.DefaultCalendarForNewReminders;

Pro uložení volejte metodu SaveReminder na :

NSError e;
App.Current.EventStore.SaveReminder ( reminder, true, out e );

Načítání události podle ID

Chcete-li načíst událost podle ID, použijte metodu EventFromIdentifier v objektu a předejte ji do objektu EventIdentifier , který byl načten z události:

EKEvent mySavedEvent = App.Current.EventStore.EventFromIdentifier ( newEvent.EventIdentifier );

Pro události jsou k dispozici dvě další vlastnosti identifikátoru, ale EventIdentifier je to ten, který je v tomto případě vhodný.

Načítání připomenutí podle ID

Chcete-li načíst připomenutí, použijte metodu GetCalendarItem a předejte ji CalendarItemIdentifier:

EKCalendarItem myReminder = App.Current.EventStore.GetCalendarItem ( reminder.CalendarItemIdentifier );

Vzhledem k tomu GetCalendarItem , že vrací hodnotu EKCalendarItem , musí být přetypování na, EKReminder Pokud potřebujete získat přístup k datům připomenutí nebo použít instanci jako EKReminder později.

Nepoužívejte GetCalendarItem pro události kalendáře, stejně jako v době psaní, nefunguje.

Odstranění události

Chcete-li odstranit událost kalendáře, zavolejte na RemoveEvent a předejte odkaz na událost a příslušné EKSpan :

NSError e;
App.Current.EventStore.RemoveEvent ( mySavedEvent, EKSpan.ThisEvent, true, out e);

Poznámka: po odstranění události se ale odkaz na událost bude null .

Odstranění připomenutí

Pokud chcete odstranit připomenutí, zavolejte removeReminder na a předejte odkaz na připomenutí:

NSError e;
App.Current.EventStore.RemoveReminder ( myReminder as EKReminder, true, out e);

Všimněte si, že ve výše uvedeném kódu je přetypování na EKReminder , protože GetCalendarItem se použilo k jeho načtení.

Hledání událostí

Pokud chcete hledat události kalendáře, musíte vytvořit objekt NSPredicate prostřednictvím metody PredicateForEvents v objektu . je NSPredicate datový objekt dotazu, který iOS používá k vyhledání shod:

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 );

Po vytvoření použijte metodu NSPredicateNSPredicate v souboru EventStore :

// execute the query
EKCalendarItem[] events = App.Current.EventStore.EventsMatching ( query );

Všimněte si, že dotazy jsou synchronní (blokující) a v závislosti na dotazu mohou trvat dlouhou dobu, takže k tomu můžete chtít spustit nové vlákno nebo úlohu.

Hledání připomenutí

Hledání připomenutí se podobá událostem. vyžaduje predikát, ale volání je už asynchronní, takže se nemusíte starat o blokování vlákna:

// 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
        } );

Souhrn

Tento dokument poskytl přehled o důležitých částech architektury EventKit a několika nejběžnějších úlohách. Rozhraní EventKit je ale velmi velké a výkonné a zahrnuje funkce, které tu nebyly představeny, jako jsou dávkové aktualizace, konfigurace alarmů, konfigurace opakování událostí, registrace a naslouchání změnám v databázi kalendáře, nastavení geografických položek a další. Další informace najdete v Průvodci programováním kalendáře a připomenutí společnostiApple.