CloudKit v Xamarin.iOS
Architektura CloudKit zjednodušuje vývoj aplikací, které přistupují k iCloudu. To zahrnuje načítání práv k datům aplikací a prostředkům a také možnost bezpečného ukládání informací o aplikaci. Tato sada poskytuje uživatelům vrstvu anonymizace tím, že umožňuje přístup k aplikacím se svými ID iCloudu bez sdílení osobních údajů.
Vývojáři se můžou zaměřit na aplikace na straně klienta a nechat iCloud eliminovat nutnost psát logiku aplikace na straně serveru. CloudKit poskytuje ověřování, privátní a veřejné databáze a strukturované služby úložiště dat a prostředků.
Důležité
Apple poskytuje nástroje , které vývojářům pomáhají správně zvládnout obecné nařízení Evropské unie o ochraně osobních údajů (GDPR).
Požadavky
K dokončení kroků uvedených v tomto článku je nutné provést následující kroky:
- Xcode a iOS SDK – rozhraní API pro Xcode a iOS 8 od Společnosti Apple je potřeba nainstalovat a nakonfigurovat na počítači vývojáře.
- Visual Studio pro Mac – Na uživatelském zařízení by se měla nainstalovat a nakonfigurovat nejnovější verze Visual Studio pro Mac.
- Zařízení s iOSem 8 – zařízení s iOSem, na kterém běží nejnovější verze iOS 8 pro testování.
Co je CloudKit?
CloudKit je způsob, jak dát vývojáři přístup k serverům iCloud. Poskytuje základ pro iCloud Drive i iCloud Photo Library. CloudKit se podporuje na zařízeních s macOS i iOS.
CloudKit používá infrastrukturu účtu iCloud. Pokud je na zařízení přihlášený uživatel k účtu iCloudu, CloudKit použije jeho ID k identifikaci uživatele. Pokud není k dispozici žádný účet, poskytne se omezený přístup jen pro čtení.
CloudKit podporuje koncept veřejných i privátních databází. Veřejné databáze poskytují "polévku" všech dat, ke kterým má uživatel přístup. Soukromé databáze mají ukládat soukromá data vázaná na konkrétního uživatele.
CloudKit podporuje strukturovaná i hromadná data. Dokáže bezproblémově zpracovávat velké přenosy souborů. CloudKit se postará o efektivní přenos velkých souborů na servery iCloudu na pozadí a z nich, takže se vývojář může soustředit na jiné úkoly.
Poznámka:
Je důležité si uvědomit, že CloudKit je transportní technologie. Neposkytuje žádnou trvalost; umožňuje aplikaci efektivně odesílat a přijímat informace ze serverů.
Od tohoto psaní apple zpočátku poskytuje CloudKitu zdarma s vysokým limitem šířky pásma i kapacity úložiště. Pro větší projekty nebo aplikace s velkou uživatelskou základnou společnost Apple naznačuje, že bude poskytován cenově dostupný cenový rozsah.
Povolení CloudKitu v aplikaci Xamarin
Než aplikace Xamarin může využívat architekturu CloudKit, musí být aplikace správně zřízena, jak je podrobně popsáno v průvodcích Práce s možnostmi a práce s nároky .
Pro přístup ke cloudKitu musí soubor Entitlements.plist obsahovat oprávnění Povolit iCloud, úložiště klíč-hodnota a CloudKit .
Ukázková aplikace
Ukázková aplikace ukazuje, jak používat CloudKit s Xamarinem. Následující postup ukazuje, jak nakonfigurovat ukázku – vyžaduje další nastavení nad rámec toho, co vyžaduje jenom CloudKit:
- Otevřete projekt v Visual Studio pro Mac nebo sadě Visual Studio.
- V Průzkumník řešení otevřete soubor Info.plist a ujistěte se, že identifikátor sady odpovídá identifikátoru sady, který byl definován v ID aplikace vytvořené v rámci nastavení zřizování.
- Posuňte se dolů do dolní části souboru Info.plist a vyberte Povolené režimy pozadí, Umístění Aktualizace a Vzdálená oznámení.
- V řešení klikněte pravým tlačítkem myši na projekt iOS a vyberte Možnosti.
- Vyberte podpis sady prostředků pro iOS, vyberte profil pro vývojáře a profil zřizování vytvořený výše.
- Ujistěte se, že seznam Entitlements.plist zahrnuje povolení iCloudu, úložiště klíč-hodnota a CloudKit.
- Ujistěte se, že pro aplikaci existuje kontejner ubiquity. Příklad:
iCloud.com.your-company.CloudKitAtlas
- Uložte změny souboru.
S těmito nastaveními je teď ukázková aplikace připravená pro přístup k rozhraním API architektury CloudKit a také ke službám pro pozadí, umístění a oznámení.
Přehled rozhraní API Pro CloudKit
Před implementací CloudKitu v aplikaci Xamarin iOS se tento článek věnuje základům architektury CloudKit, která bude obsahovat následující témata:
- Kontejnery – izolované sila komunikace iCloudu.
- Databáze – veřejné a soukromé jsou pro aplikaci k dispozici.
- Záznamy – mechanismus, ve kterém se strukturovaná data přesunou do a z CloudKitu.
- Zóny záznamů – jsou skupiny záznamů.
- Identifikátory záznamů – Jsou plně normalizovány a představují konkrétní umístění záznamu.
- Odkaz – Poskytuje vztahy nadřazenosti a podřízenosti mezi souvisejícími záznamy v rámci dané databáze.
- Prostředky – Povolí nahrání souboru velkých nestrukturovaných dat do iCloudu a jeho přidružení k danému záznamu.
Kontejnery
Daná aplikace spuštěná na zařízení s iOSem vždy běží souběžně s jinými aplikacemi a službami na daném zařízení. Na klientském zařízení bude aplikace nějakým způsobem vysílaná nebo sandboxová. V některých případech se jedná o literální sandbox a v jiných případech aplikace jednoduše běží v jejím vlastním paměťovém prostoru.
Koncept převzetí klientské aplikace a jeho spuštění oddělené od ostatních klientů je velmi výkonný a poskytuje následující výhody:
- Zabezpečení – Jedna aplikace nemůže kolidovat s jinými klientskými aplikacemi nebo samotným operačním systémem.
- Stabilita – Pokud dojde k chybovému ukončení klientské aplikace, nemůže vyřídit jiné aplikace operačního systému.
- Ochrana osobních údajů – Každá klientská aplikace má omezený přístup k osobním údajům uloženým v zařízení.
CloudKit byl navržen tak, aby poskytoval stejné výhody jako výše uvedené, a použil je na práci s cloudovými informacemi:
Stejně jako aplikace, která je na zařízení spuštěná 1:N, je to komunikace aplikace s iCloudem 1:N. Každé z těchto různých komunikačních sil se nazývá Kontejnery.
Kontejnery se zveřejňují v architektuře CloudKit Framework prostřednictvím CKContainer
třídy. Ve výchozím nastavení jedna aplikace komunikuje s jedním kontejnerem a tento kontejner odděluje data pro danou aplikaci. To znamená, že několik aplikací může ukládat informace do stejného účtu iCloud, ale tyto informace se nikdy nepromění.
Kontejnerizace dat iCloudu také umožňuje, aby CloudKit zapouzdřil informace o uživatelích. Tímto způsobem bude mít aplikace omezený přístup k účtu iCloud a informacím o uživatelích uložených v tomto prostředí, a zároveň bude chránit ochranu osobních údajů a zabezpečení uživatele.
Kontejnery plně spravuje vývojář aplikace prostřednictvím portálu WWDR. Obor názvů kontejneru je globální pro všechny vývojáře Apple, takže kontejner nesmí být jedinečný jenom pro aplikace daného vývojáře, ale pro všechny vývojáře a aplikace Apple.
Apple navrhuje použití zpětného zápisu DNS při vytváření oboru názvů pro kontejnery aplikací. Příklad: iCloud.com.company-name.application-name
Kontejnery jsou ve výchozím nastavení vázané 1:1 na danou aplikaci, ale dají se sdílet mezi aplikacemi. Více aplikací tak může koordinovat jeden kontejner. Jedna aplikace může také komunikovat s více kontejnery.
Databáze
Jednou z hlavních funkcí CloudKitu je vzít datový model a replikaci aplikace, které modeluje až na servery iCloud. Některé informace jsou určené pro uživatele, který ho vytvořil, a další informace jsou veřejná data, která by mohl uživatel vytvořit pro veřejné použití (jako je recenze restaurace), nebo můžou být informace, které vývojář publikoval pro aplikaci. V obou případech není cílová skupina jen jedním uživatelem, ale je to komunita lidí.
Uvnitř kontejneru je především veřejná databáze. To je místo, kde se nacházejí všechny veřejné informace a spolu-mingles. Kromě toho existuje několik jednotlivých privátních databází pro každého uživatele aplikace.
Při spuštění na zařízení s iOSem bude mít aplikace přístup pouze k informacím aktuálně přihlášeného uživatele iCloudu. Zobrazení kontejneru aplikace bude tedy následující:
Může zobrazit pouze veřejnou databázi a privátní databázi přidruženou k aktuálně přihlášeným uživatelům iCloudu.
Databáze se zveřejňují v architektuře CloudKit Framework prostřednictvím CKDatabase
třídy. Každá aplikace má přístup ke dvěma databázím: veřejné databázi a privátní databázi.
Kontejner je počáteční vstupní bod do CloudKitu. Následující kód lze použít pro přístup k veřejné a privátní databázi z výchozího kontejneru aplikace:
using CloudKit;
//...
public CKDatabase PublicDatabase { get; set; }
public CKDatabase PrivateDatabase { get; set; }
//...
// Get the default public and private databases for
// the application
PublicDatabase = CKContainer.DefaultContainer.PublicCloudDatabase;
PrivateDatabase = CKContainer.DefaultContainer.PrivateCloudDatabase;
Tady jsou rozdíly mezi typy databáze:
Veřejná databáze | Soukromá databáze | |
---|---|---|
Datový typ | Sdílená data | Data aktuálního uživatele |
Kvóta | Účet pro kvótu vývojáře | Účet pro kvótu uživatele |
Výchozí oprávnění | Svět čitelný | Uživatel čitelný |
Oprávnění pro úpravy | Role řídicího panelu iCloudu prostřednictvím úrovně třídy záznamů | – |
Záznamy
Kontejnery uchovávají databáze a uvnitř databází jsou záznamy. Záznamy jsou mechanismus, ve kterém se strukturovaná data přesouvají do a z CloudKitu:
Záznamy se zveřejňují v architektuře CloudKit Framework prostřednictvím CKRecord
třídy, která zabalí páry klíč-hodnota. Instance objektu v aplikaci je ekvivalentní objektu CKRecord
v CloudKitu. Každý z nich CKRecord
má navíc typ záznamu, který je ekvivalentní třídě objektu.
Záznamy mají schéma za běhu, takže data se před předáním ke zpracování popisují do CloudKitu. Od tohoto okamžiku bude CloudKit interpretovat informace a zpracovávat logistiku ukládání a načítání záznamu.
Třída CKRecord
také podporuje širokou škálu metadat. Záznam například obsahuje informace o tom, kdy byl vytvořen, a uživatel, který ho vytvořil. Záznam obsahuje také informace o tom, kdy byl naposledy změněn, a uživatel, který ho upravil.
Záznamy obsahují pojem change tag. Toto je předchozí verze revize daného záznamu. Značka change se používá jako lehký způsob určení, jestli klient a server mají stejnou verzi daného záznamu.
Jak je uvedeno výše, CKRecords
zabalte páry klíč-hodnota a například následující typy dat mohou být uloženy v záznamu:
NSString
NSNumber
NSData
NSDate
CLLocation
CKReferences
CKAssets
Kromě typů s jednou hodnotou může záznam obsahovat homogenní pole libovolného z výše uvedených typů.
Pomocí následujícího kódu můžete vytvořit nový záznam a uložit ho do databáze:
using CloudKit;
//...
private const string ReferenceItemRecordName = "ReferenceItems";
//...
var newRecord = new CKRecord (ReferenceItemRecordName);
newRecord ["name"] = (NSString)nameTextField.Text;
await CloudManager.SaveAsync (newRecord);
Záznamové zóny
Záznamy v dané databázi neexistují samy – skupiny záznamů existují společně uvnitř zóny záznamů. Zóny záznamů lze považovat za tabulky v tradičních relačních databázích:
V dané zóně záznamů a v dané databázi může existovat více záznamů a více zón záznamů. Každá databáze obsahuje výchozí zónu záznamu:
Tady se ve výchozím nastavení ukládají záznamy. Kromě toho je možné vytvořit vlastní zóny záznamů. Zóny záznamů představují základní členitost, při které se provádí atomické potvrzení a sledování změn.
Identifikátory záznamů
Identifikátory záznamů jsou reprezentovány jako řazená kolekce členů, která obsahuje klientský zadaný název záznamu a zónu, ve které záznam existuje. Identifikátory záznamů mají následující charakteristiky:
- Jsou vytvořeny klientskou aplikací.
- Jsou plně normalizované a představují konkrétní umístění záznamu.
- Přiřazením jedinečného ID záznamu v cizí databázi k názvu záznamu je možné použít k přemostění místních databází, které nejsou uložené v CloudKitu.
Když vývojáři vytvářejí nové záznamy, můžou se rozhodnout předat identifikátor záznamu. Pokud není zadaný identifikátor záznamu, automaticky se vytvoří a přiřadí identifikátor UUID záznamu.
Když vývojáři vytvoří nové identifikátory záznamů, můžou určit zónu záznamu, do které bude každý záznam patřit. Pokud není zadán žádný, použije se výchozí zóna záznamu.
Identifikátory záznamů se zveřejňují v architektuře CloudKit Framework prostřednictvím CKRecordID
třídy. K vytvoření nového identifikátoru záznamu můžete použít následující kód:
var recordID = new CKRecordID("My Record");
Reference
Odkazy poskytují vztahy mezi souvisejícími záznamy v rámci dané databáze:
Ve výše uvedeném příkladu rodiče vlastní podřízené položky, aby podřízený záznam nadřazeného záznamu byl podřízeným záznamem. Relace přejde z podřízeného záznamu do nadřazeného záznamu a označuje se jako odkaz zpět.
Odkazy se zveřejňují v architektuře CloudKit Framework prostřednictvím CKReference
třídy. Představují způsob, jak umožnit serveru iCloud pochopit vztah mezi záznamy.
Odkazy poskytují mechanismus kaskádových odstranění. Pokud se z databáze odstraní nadřazený záznam, všechny podřízené záznamy (jak je uvedeno v relaci) se automaticky odstraní i z databáze.
Poznámka:
Při používání Sady CloudKit jsou možné ukazatele na dangling. Například v době, kdy aplikace načte seznam ukazatelů záznamů, vybrali záznam a pak požádali o záznam, nemusí záznam v databázi existovat. Aplikace musí být zakódovaná, aby tuto situaci zvládla elegantně.
I když není vyžadováno, při práci s architekturou CloudKit Framework se preferují zpětné odkazy. Společnost Apple vyladila systém tak, aby byl nejúčinnějším typem odkazu.
Při vytváření odkazu může vývojář buď poskytnout záznam, který je již v paměti, nebo vytvořit odkaz na identifikátor záznamu. Pokud použijete identifikátor záznamu a zadaný odkaz v databázi neexistuje, vytvoří se ukazatel dangling.
Následuje příklad vytvoření odkazu na známý záznam:
var reference = new CKReference(newRecord, new CKReferenceAction());
Materiály
Prostředky umožňují nahrát soubor velkých nestrukturovaných dat do iCloudu a přidružit k danému záznamu:
V klientovi se vytvoří soubor CKRecord
, který popisuje soubor, který se nahraje na server iCloudu. Vytvoří se soubor, CKAsset
který bude obsahovat a je propojený se záznamem, který ho popisuje.
Po nahrání souboru na server se záznam umístí do databáze a soubor se zkopíruje do speciální databáze hromadného úložiště. Vytvoří se odkaz mezi ukazatelem záznamu a nahraným souborem.
Prostředky se zveřejňují v architektuře CloudKit Framework prostřednictvím CKAsset
třídy a používají se k ukládání velkých nestrukturovaných dat. Vzhledem k tomu, že vývojář nikdy nechce mít velká, nestrukturovaná data v paměti, prostředky se implementují pomocí souborů na disku.
Prostředky vlastní záznamy, které umožňují načtení prostředků z iCloudu pomocí záznamu jako ukazatele. Tímto způsobem může server smazat prostředky uvolňování paměti při odstranění záznamu, který je vlastníkem prostředku.
Vzhledem k tomu CKAssets
, že se jedná o zpracování velkých datových souborů, společnost Apple navrhla CloudKit tak, aby efektivně nahrála a stáhla prostředky.
Pomocí následujícího kódu můžete vytvořit asset a přidružit ho k záznamu:
var fileUrl = new NSUrl("LargeFile.mov");
var asset = new CKAsset(fileUrl);
newRecord ["name"] = asset;
Nyní jsme probrali všechny základní objekty v CloudKitu. Kontejnery jsou přidružené k aplikacím a obsahují databáze. Databáze obsahují záznamy, které jsou seskupené do zón záznamů a odkazují na identifikátory záznamů. Relace nadřazenosti a podřízenosti jsou definovány mezi záznamy pomocí odkazů. Nakonec lze velké soubory nahrát a přidružit k záznamům pomocí prostředků.
Rozhraní API Pro pohodlí CloudKitu
Apple nabízí dvě různé sady rozhraní API pro práci s CloudKitem:
- Provozní rozhraní API – nabízí všechny funkce CloudKitu. U složitějších aplikací poskytuje toto rozhraní API jemně odstupňovanou kontrolu nad CloudKitem.
- Rozhraní API pro pohodlí – nabízí běžnou předem nakonfigurovanou podmnožinu funkcí CloudKitu. Poskytuje pohodlné a snadné řešení přístupu pro zahrnutí funkcí CloudKit v aplikaci pro iOS.
Rozhraní API pro pohodlí je obvykle nejlepší volbou pro většinu aplikací pro iOS a Apple navrhuje začít s ním. Zbývající část této části se věnuje následujícím tématům rozhraní API pro pohodlí:
- Uložení záznamu
- Načtení záznamu
- Aktualizace záznamu
Běžný instalační kód
Než začnete s rozhraním API Pro usnadnění práce s CloudKitem, vyžaduje se nějaký standardní instalační kód. Začněte úpravou souboru aplikace AppDelegate.cs
a nastavte, aby vypadal takto:
using System;
using System.Collections.Generic;
using System.Linq;
using Foundation;
using UIKit;
using CloudKit;
namespace CloudKitAtlas
{
[Register ("AppDelegate")]
public partial class AppDelegate : UIApplicationDelegate
{
public override UIWindow Window { get; set;}
public CKDatabase PublicDatabase { get; set; }
public CKDatabase PrivateDatabase { get; set; }
public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
{
application.RegisterForRemoteNotifications ();
// Get the default public and private databases for
// the application
PublicDatabase = CKContainer.DefaultContainer.PublicCloudDatabase;
PrivateDatabase = CKContainer.DefaultContainer.PrivateCloudDatabase;
return true;
}
public override void RegisteredForRemoteNotifications (UIApplication application, NSData deviceToken)
{
Console.WriteLine ("Registered for Push notifications with token: {0}", deviceToken);
}
public override void FailedToRegisterForRemoteNotifications (UIApplication application, NSError error)
{
Console.WriteLine ("Push subscription failed");
}
public override void ReceivedRemoteNotification (UIApplication application, NSDictionary userInfo)
{
Console.WriteLine ("Push received");
}
}
}
Výše uvedený kód zpřístupňuje veřejné a privátní databáze CloudKit jako klávesové zkratky, aby se snadněji pracovalo ve zbytku aplikace.
Dále přidejte následující kód do libovolného kontejneru zobrazení nebo zobrazení, který bude používat CloudKit:
using CloudKit;
//...
public AppDelegate ThisApp {
get { return (AppDelegate)UIApplication.SharedApplication.Delegate; }
}
Tím se přidá zástupce pro přístup k AppDelegate
zástupcům veřejné a privátní databáze vytvořené výše.
S tímto kódem se podíváme na implementaci rozhraní API CloudKit Convenience v aplikaci Xamarin iOS 8.
Uložení záznamu
Pomocí výše uvedeného vzoru při diskusi o záznamech vytvoří následující kód nový záznam a pomocí rozhraní API Pro pohodlí ho uloží do veřejné databáze:
private const string ReferenceItemRecordName = "ReferenceItems";
...
// Create a new record
var newRecord = new CKRecord (ReferenceItemRecordName);
newRecord ["name"] = (NSString)nameTextField.Text;
// Save it to the database
ThisApp.PublicDatabase.SaveRecord(newRecord, (record, err) => {
// Was there an error?
if (err != null) {
...
}
});
Tři věci, které je potřeba si uvědomit o výše uvedeném kódu:
SaveRecord
Voláním metodyPublicDatabase
, vývojář nemusí určit, jak se data odesílají, do jaké zóny se zapisují atd. Rozhraní API pro pohodlí se stará o všechny podrobnosti samotné.- Volání je asynchronní a poskytuje rutinu zpětného volání po dokončení volání, a to buď s úspěchem nebo selháním. Pokud volání selže, zobrazí se chybová zpráva.
- CloudKit neposkytuje místní úložiště nebo trvalost; jedná se pouze o přenosové médium. Takže když je žádost o uložení záznamu, okamžitě se odešle na servery iCloud.
Poznámka:
Kvůli "ztrátě" povahu komunikace mobilních sítí, kdy se připojení neustále ruší nebo ruší, musí vývojář při práci s CloudKitem zvážit jednu z prvních aspektů.
Načtení záznamu
Po vytvoření a úspěšném uložení záznamu na serveru iCloud použijte následující kód k načtení záznamu:
// Create a record ID and fetch the record from the database
var recordID = new CKRecordID("MyRecordName");
ThisApp.PublicDatabase.FetchRecord(recordID, (record, err) => {
// Was there an error?
if (err != null) {
...
}
});
Stejně jako při ukládání záznamu je výše uvedený kód asynchronní, jednoduchý a vyžaduje skvělé zpracování chyb.
Aktualizace záznamu
Po načtení záznamu ze serverů iCloud je možné použít následující kód k úpravě záznamu a uložení změn zpět do databáze:
// Create a record ID and fetch the record from the database
var recordID = new CKRecordID("MyRecordName");
ThisApp.PublicDatabase.FetchRecord(recordID, (record, err) => {
// Was there an error?
if (err != null) {
} else {
// Modify the record
record["name"] = (NSString)"New Name";
// Save changes to database
ThisApp.PublicDatabase.SaveRecord(record, (r, e) => {
// Was there an error?
if (e != null) {
...
}
});
}
});
Metoda FetchRecord
PublicDatabase
vrátí CKRecord
, pokud volání bylo úspěšné. Aplikace pak upraví záznam a volání SaveRecord
znovu zapíše změny zpět do databáze.
Tato část ukazuje typický cyklus, který bude aplikace používat při práci s rozhraním API CloudKit Convenience. Aplikace uloží záznamy do iCloudu, načte tyto záznamy z iCloudu, upraví záznamy a uloží tyto změny zpět na iCloud.
Návrh pro škálovatelnost
Zatím se tento článek zabýval ukládáním a načítáním celého objektového modelu aplikace ze serverů iCloud, a to pokaždé, když se s ním bude pracovat. I když tento přístup funguje dobře s malým množstvím dat a velmi malou uživatelskou základnou, není při zvýšení množství informací nebo uživatelské základny dobře škálovat.
Velké objemy dat, malé zařízení
Čím oblíbenější je aplikace, tím více dat v databázi a tím méně proveditelné je mít na zařízení mezipaměť všech dat. K vyřešení tohoto problému můžete použít následující techniky:
- Udržování velkých dat v cloudu – CloudKit byl navržen tak, aby efektivně zpracovával velké objemy dat.
- Klient by měl zobrazit jenom řez těchto dat – Zkrátíte úplné minimum dat potřebných ke zpracování libovolného úkolu v daném okamžiku.
- Zobrazení klienta se můžou změnit – protože každý uživatel má jiné předvolby, může se řez zobrazených dat změnit od uživatele po uživatele a individuální zobrazení libovolného daného řezu se může lišit.
- Klient používá dotazy k zaměření zobrazení – Dotazy umožňují uživateli zobrazit malou podmnožinu větší datové sady, která existuje v cloudu.
Dotazy
Jak je uvedeno výše, dotazy umožňují vývojáři vybrat malou podmnožinu větší datové sady, která existuje v cloudu. Dotazy se zveřejňují v architektuře CloudKit Framework prostřednictvím CKQuery
třídy.
Dotaz kombinuje tři různé věci: typ záznamu ( RecordType
), predikát ( NSPredicate
) a volitelně popisovač řazení ( NSSortDescriptors
). CloudKit podporuje většinu z NSPredicate
.
Podporované predikáty
CloudKit podporuje při práci s dotazy následující typy NSPredicates
:
Odpovídající záznamy, ve kterých se název rovná hodnotě uložené v proměnné:
NSPredicate.FromFormat(string.Format("name = '{0}'", recordName))
Umožňuje založena na hodnotě dynamického klíče, takže klíč nemusí být v době kompilace znám:
NSPredicate.FromFormat(string.Format("{0} = '{1}'", key, value))
Odpovídající záznamy, ve kterých je hodnota záznamu větší než daná hodnota:
NSPredicate.FromFormat(string.Format("start > {0}", (NSDate)date))
Odpovídající záznamy, kde umístění záznamu je v dosahu 100 metrů od daného umístění:
var location = new CLLocation(37.783,-122.404); var predicate = NSPredicate.FromFormat(string.Format("distanceToLocation:fromLocation(Location,{0}) < 100", location));
CloudKit podporuje tokenizované vyhledávání. Toto volání vytvoří dva tokeny, jeden pro
after
a druhý prosession
. Vrátí záznam, který obsahuje tyto dva tokeny:NSPredicate.FromFormat(string.Format("ALL tokenize({0}, 'Cdl') IN allTokens", "after session"))
CloudKit podporuje složené predikáty spojené pomocí operátoru
AND
.NSPredicate.FromFormat(string.Format("start > {0} AND name = '{1}'", (NSDate)date, recordName))
Vytváření dotazů
Následující kód lze použít k vytvoření CKQuery
v aplikaci Xamarin iOS 8:
var recordName = "MyRec";
var predicate = NSPredicate.FromFormat(string.Format("name = '{0}'", recordName));
var query = new CKQuery("CloudRecords", predicate);
Nejprve vytvoří predikát pro výběr pouze záznamů, které odpovídají danému názvu. Pak vytvoří dotaz, který vybere záznamy daného typu záznamu, který odpovídá predikátu.
Provedení dotazu
Po vytvoření dotazu použijte následující kód k provedení dotazu a zpracování vrácených záznamů:
var recordName = "MyRec";
var predicate = NSPredicate.FromFormat(string.Format("name = {0}", recordName));
var query = new CKQuery("CloudRecords", predicate);
ThisApp.PublicDatabase.PerformQuery(query, CKRecordZone.DefaultRecordZone().ZoneId, (NSArray results, NSError err) => {
// Was there an error?
if (err != null) {
...
} else {
// Process the returned records
for(nint i = 0; i < results.Count; ++i) {
var record = (CKRecord)results[i];
}
}
});
Výše uvedený kód vezme dotaz vytvořený výše a spustí ho proti veřejné databázi. Vzhledem k tomu, že není zadána žádná zóna záznamu, prohledávají se všechny zóny. Pokud nedošlo k žádným chybám, vrátí se pole CKRecords
odpovídající parametrům dotazu.
Způsob, jak přemýšlet o dotazech, je, že se dotazují a jsou skvělé při vytváření řezů prostřednictvím velkých datových sad. Dotazy ale nejsou vhodné pro velké, většinou statické datové sady z následujících důvodů:
- Jsou špatné pro životnost baterie zařízení.
- Jsou špatné pro síťový provoz.
- Jsou špatné pro uživatelské prostředí, protože informace, které vidí, jsou omezené tím, jak často aplikace dotazuje databázi. Uživatelé dnes očekávají nabízená oznámení, když se něco změní.
Předplatná
Při práci s velkými, většinou statickými datovými sadami by se dotaz neměl provádět na klientském zařízení, měl by běžet na serveru jménem klienta. Dotaz by se měl spustit na pozadí a měl by se spustit po každém uložení jednoho záznamu bez ohledu na to, jestli aktuální zařízení nebo jiné zařízení, které se dotýká stejné databáze.
Nakonec by se při spuštění dotazu na straně serveru mělo odeslat nabízené oznámení každému zařízení připojenému k databázi.
Předplatná se zveřejňují v architektuře CloudKit Framework prostřednictvím CKSubscription
třídy. Kombinují typ záznamu ( RecordType
), predikát ( NSPredicate
) a Apple Push Notification ( Push
).
Poznámka:
Nabízení CloudKitu se mírně rozšiřují, protože obsahují datovou část obsahující konkrétní informace o CloudKitu, jako je například to, co způsobilo, že nabízení proběhlo.
Jak fungují předplatná
Před implementací předplatného v kódu jazyka C# si pojďme rychle projít přehled o tom, jak předplatná fungují:
Výše uvedený graf znázorňuje typický proces předplatného následujícím způsobem:
- Klientské zařízení vytvoří nové předplatné obsahující sadu podmínek, které aktivují odběr, a nabízené oznámení, které se odešle při aktivaci.
- Předplatné se odešle do databáze, do které se přidá do kolekce existujících předplatných.
- Druhé zařízení vytvoří nový záznam a uloží ho do databáze.
- Databáze prohledá seznam předplatných a zjistí, jestli nový záznam odpovídá některé z jejich podmínek.
- Pokud se najde shoda, nabízené oznámení se odešle do zařízení, které zaregistrovalo předplatné s informacemi o záznamu, který ho způsobil aktivaci.
S těmito znalostmi se podíváme na vytváření předplatných v aplikaci Xamarin iOS 8.
Vytváření předplatných
K vytvoření předplatného můžete použít následující kód:
// Create a new subscription
DateTime date;
var predicate = NSPredicate.FromFormat(string.Format("start > {0}", (NSDate)date));
var subscription = new CKSubscription("RecordType", predicate, CKSubscriptionOptions.FiresOnRecordCreation);
// Describe the type of notification
var notificationInfo = new CKNotificationInfo();
notificationInfo.AlertLocalizationKey = "LOCAL_NOTIFICATION_KEY";
notificationInfo.SoundName = "ping.aiff";
notificationInfo.ShouldBadge = true;
// Attach the notification info to the subscription
subscription.NotificationInfo = notificationInfo;
Nejprve vytvoří predikát, který poskytne podmínku pro aktivaci předplatného. V dalším kroku vytvoří odběr pro konkrétní typ záznamu a nastaví možnost při testování triggeru. Nakonec definuje typ oznámení, ke kterému dojde při aktivaci předplatného, a připojí ho k předplatnému.
Ukládání předplatných
Po vytvoření předplatného ho následující kód uloží do databáze:
// Save the subscription to the database
ThisApp.PublicDatabase.SaveSubscription(subscription, (s, err) => {
// Was there an error?
if (err != null) {
}
});
Pomocí rozhraní API pro pohodlí je volání asynchronní, jednoduché a poskytuje snadné zpracování chyb.
Zpracování nabízených oznámení
Pokud vývojář dříve použil Apple Push Notifications (APS), měl by být proces zpracování oznámení generovaných CloudKitem známý.
V sadě AppDelegate.cs
, přepsat ReceivedRemoteNotification
třídu následujícím způsobem:
public override void ReceivedRemoteNotification (UIApplication application, NSDictionary userInfo)
{
// Parse the notification into a CloudKit Notification
var notification = CKNotification.FromRemoteNotificationDictionary (userInfo);
// Get the body of the message
var alertBody = notification.AlertBody;
// Was this a query?
if (notification.NotificationType == CKNotificationType.Query) {
// Yes, convert to a query notification and get the record ID
var query = notification as CKQueryNotification;
var recordID = query.RecordId;
}
}
Výše uvedený kód požádá CloudKit o parsování userInfo do oznámení CloudKitu. Dále se extrahují informace o výstraze. Nakonec se testuje typ oznámení a oznámení se zpracuje odpovídajícím způsobem.
V této části se dozvíte, jak pomocí dotazů a předplatných odpovědět na výše uvedený problém s velkými objemy dat. Aplikace ponechá velká data v cloudu a pomocí těchto technologií poskytne zobrazení této datové sady.
Uživatelské účty CloudKit
Jak je uvedeno na začátku tohoto článku, CloudKit je postaven na stávající infrastruktuře iCloudu. V následující části se podrobně dozvíte, jak se účty zveřejňují vývojáři pomocí rozhraní CloudKit API.
Ověřování
Při práci s uživatelskými účty je prvním aspektem ověřování. CloudKit podporuje ověřování prostřednictvím aktuálně přihlášeného uživatele iCloudu na zařízení. Ověřování probíhá na pozadí a zpracovává ho iOS. Vývojáři se tak nikdy nemusí starat o podrobnosti implementace ověřování. Testují pouze to, jestli je uživatel přihlášený.
Informace o uživatelském účtu
CloudKit poskytuje vývojáři následující informace o uživateli:
- Identita – způsob, jak uživatele jednoznačně identifikovat.
- Metadata – možnost ukládat a načítat informace o uživatelích.
- Ochrana osobních údajů – Všechny informace se zpracovávají v panství při vědomí ochrany osobních údajů. Nic se nezobrazí, pokud se s tím uživatel neschybí.
- Zjišťování – umožňuje uživatelům zjistit své přátele, kteří používají stejnou aplikaci.
V dalším kroku se podrobněji podíváme na tato témata.
Identita
Jak je uvedeno výše, CloudKit poskytuje aplikaci způsob, jak jednoznačně identifikovat daného uživatele:
Na zařízeních uživatele a ve všech konkrétních privátních databázích uživatele v kontejneru CloudKit je spuštěná klientská aplikace. Klientská aplikace bude propojená s jedním z těchto konkrétních uživatelů. To je založené na uživateli, který je přihlášený k iCloudu místně na zařízení.
Vzhledem k tomu, že pochází z iCloudu, existuje bohaté úložiště informací o uživateli. A protože iCloud ve skutečnosti hostuje kontejner, může korelovat uživatele. Na obrázku výše je uživatel, jehož účet user@icloud.com
iCloud je propojený s aktuálním klientem.
V kontejneru podle kontejneru se vytvoří jedinečné náhodně generované ID uživatele a přidružuje se k účtu iCloud uživatele (e-mailová adresa). Toto ID uživatele se vrátí do aplikace a dá se použít jakýmkoli způsobem, který vývojář vidí.
Poznámka:
Různé aplikace spuštěné na stejném zařízení pro stejného uživatele iCloudu budou mít různá ID uživatelů, protože jsou připojené k různým kontejnerům CloudKit.
Následující kód získá ID uživatele CloudKit pro aktuálně přihlášeného uživatele iCloudu na zařízení:
public CKRecordID UserID { get; set; }
...
// Get the CloudKit User ID
CKContainer.DefaultContainer.FetchUserRecordId ((recordID, err) => {
// Was there an error?
if (err!=null) {
Console.WriteLine("Error: {0}", err.LocalizedDescription);
} else {
// Save user ID
UserID = recordID;
}
});
Výše uvedený kód žádá kontejner CloudKit, aby zadal ID aktuálně přihlášeného uživatele. Vzhledem k tomu, že tyto informace pocházejí ze serveru iCloud, volání je asynchronní a zpracování chyb je povinné.
Metadata
Každý uživatel v CloudKitu má specifická metadata, která je popisují. Tato metadata jsou reprezentována jako záznam CloudKit:
Při pohledu do privátní databáze pro konkrétního uživatele kontejneru existuje jeden záznam, který tento uživatel definuje. Ve veřejné databázi existuje mnoho uživatelských záznamů, jeden pro každého uživatele kontejneru. Jedna z těchto možností bude mít ID záznamu, které odpovídá aktuálně přihlášeným ID záznamu uživatele.
Záznamy uživatelů ve veřejné databázi jsou po celém světě čitelné. Jsou zpracovávány, pro většinu, jako běžný záznam a mají typ CKRecordTypeUserRecord
. Tyto záznamy jsou rezervovány systémem a nejsou k dispozici pro dotazy.
Pro přístup k záznamu uživatele použijte následující kód:
public CKRecord UserRecord { get; set; }
...
// Get the user's record
PublicDatabase.FetchRecord(UserID, (record ,er) => {
//was there an error?
if (er != null) {
Console.WriteLine("Error: {0}", er.LocalizedDescription);
} else {
// Save the user record
UserRecord = record;
}
});
Výše uvedený kód žádá veřejnou databázi, aby vrátila záznam uživatele pro uživatele, ke kterému jsme přistupovali výše. Vzhledem k tomu, že tyto informace pocházejí ze serveru iCloud, volání je asynchronní a zpracování chyb je povinné.
Ochrana osobních údajů
CloudKit byl ve výchozím nastavení navržen tak, aby chránil soukromí aktuálně přihlášeného uživatele. Ve výchozím nastavení se nezoznají žádné osobní údaje o uživateli. Existují případy, kdy aplikace bude vyžadovat omezené informace o uživateli.
V těchto případech může aplikace požádat, aby uživatel tyto informace zpřístupnil. Uživateli se zobrazí dialogové okno s žádostí o vyjádření souhlasu s zveřejněním informací o účtu.
Zjišťování
Za předpokladu, že se uživatel rozhodl povolit aplikaci omezený přístup k informacím o svém uživatelském účtu, může být zjistitelný pro ostatní uživatele aplikace:
Klientská aplikace mluví s kontejnerem a kontejner mluví o iCloudu, aby měl přístup k informacím o uživateli. Uživatel může zadat e-mailovou adresu a zjišťování je možné použít k získání informací o uživateli. Volitelně můžete ID uživatele použít také ke zjišťování informací o uživateli.
CloudKit také poskytuje způsob, jak zjistit informace o všech uživatelích, kteří můžou být přáteli aktuálně přihlášeného uživatele iCloudu, dotazováním celého adresáře. Proces CloudKitu stáhne kontaktní knihu uživatele a pomocí e-mailových adres zjistí, jestli najde aplikace jiného uživatele, která odpovídá těmto adresám.
Aplikace tak může využívat adresář kontaktů uživatele, aniž by k němu poskytl přístup nebo požádal uživatele, aby schvaloval přístup ke kontaktům. V žádném okamžiku nejsou kontaktní informace zpřístupněné aplikaci, přístup má pouze proces CloudKit.
Pro rekapitulace existují tři různé druhy vstupů, které jsou k dispozici pro zjišťování uživatelů:
- ID záznamu uživatele – Zjišťování lze provést s ID uživatele aktuálně přihlášeného uživatele CloudKit.
- E-mailová adresa uživatele – Uživatel může zadat e-mailovou adresu a dá se použít ke zjišťování.
- Contact Book – Adresář uživatele se dá použít ke zjišťování uživatelů aplikace, kteří mají stejnou e-mailovou adresu jako v jejich kontaktech.
Zjišťování uživatelů vrátí následující informace:
- ID záznamu uživatele – jedinečné ID uživatele ve veřejné databázi.
- Jméno a příjmení – jak je uloženo ve veřejné databázi.
Tyto informace budou vráceny pouze uživatelům, kteří se přihlásili ke zjišťování.
Následující kód zjistí informace o uživateli, který je aktuálně přihlášený k iCloudu na zařízení:
public CKDiscoveredUserInfo UserInfo { get; set; }
//...
// Get the user's metadata
CKContainer.DefaultContainer.DiscoverUserInfo(UserID, (info, e) => {
// Was there an error?
if (e != null) {
Console.WriteLine("Error: {0}", e.LocalizedDescription);
} else {
// Save the user info
UserInfo = info;
}
});
Pomocí následujícího kódu se můžete dotazovat na všechny uživatele v aplikaci Contact Book:
// Ask CloudKit for all of the user's friends information
CKContainer.DefaultContainer.DiscoverAllContactUserInfos((info, er) => {
// Was there an error
if (er != null) {
Console.WriteLine("Error: {0}", er.LocalizedDescription);
} else {
// Process all returned records
for(int i = 0; i < info.Count(); ++i) {
// Grab a user
var userInfo = info[i];
}
}
});
V této části jsme probrali čtyři hlavní oblasti přístupu k účtu uživatele, který CloudKit může aplikaci poskytnout. Od získání identity a metadat uživatele až po zásady ochrany osobních údajů, které jsou integrované do CloudKitu, a nakonec možnost zjistit další uživatele aplikace.
Vývojová a produkční prostředí
CloudKit poskytuje samostatná vývojová a produkční prostředí pro typy záznamů a data aplikace. Vývojové prostředí je flexibilnější prostředí, které je dostupné jenom členům vývojového týmu. Když aplikace přidá do záznamu nové pole a uloží ho do vývojového prostředí, server automaticky aktualizuje informace o schématu.
Vývojář může tuto funkci použít k provádění změn schématu během vývoje, což šetří čas. Jedním z upozornění je to, že po přidání pole do záznamu nelze datový typ přidružený k danému poli programově změnit. Pokud chcete změnit typ pole, musí vývojář odstranit pole na řídicím panelu CloudKit a přidat ho znovu s novým typem.
Před nasazením aplikace může vývojář migrovat schéma a data do produkčního prostředí pomocí řídicího panelu CloudKit. Při spuštění v produkčním prostředí server brání aplikaci v programové změně schématu. Vývojář může stále provádět změny pomocí řídicího panelu CloudKit, ale pokusí se přidat pole do záznamu v produkčním prostředí, což vede k chybám.
Poznámka:
Simulátor iOS funguje jenom s vývojovým prostředím. Když je vývojář připravený k otestování aplikace v produkčním prostředí, vyžaduje se fyzické zařízení s iOSem.
Odeslání aplikace s podporou CloudKitu
Před odesláním aplikace, která používá CloudKit, bude nutné ji nakonfigurovat tak, aby cílila na produkční prostředí CloudKit, nebo bude aplikace odmítnuta společností Apple.
Postupujte následovně:
V sadě Visual Studio pro Ma zkompilujte aplikaci pro vydání>zařízení s iOSem:
V nabídce Sestavení vyberte Archiv:
Archiv se vytvoří a zobrazí v Visual Studio pro Mac:
Spusťte Xcode.
V nabídce Okno vyberte Organizátor:
Vyberte archiv aplikace a klikněte na tlačítko Exportovat...
Vyberte metodu pro export a klikněte na tlačítko Další :
V rozevíracím seznamu vyberte vývojový tým a klikněte na tlačítko Zvolit:
V rozevíracím seznamu vyberte Produkční a klikněte na tlačítko Další :
Zkontrolujte nastavení a klikněte na tlačítko Exportovat :
Zvolte umístění pro vygenerování výsledného souboru aplikace
.ipa
.
Proces je podobný odeslání aplikace přímo do iTunes Připojení, stačí kliknout na tlačítko Odeslat... místo exportu... po výběru archivu v okně Organizátor.
Kdy používat CloudKit
Jak jsme viděli v tomto článku, CloudKit poskytuje snadný způsob, jak aplikace ukládat a načítat informace ze serverů iCloud. To znamená, že CloudKit zastaralá ani nezastarává žádné z existujících nástrojů nebo architektur.
Případy použití
Následující případy použití by měly vývojářům pomoct rozhodnout, kdy použít konkrétní architekturu nebo technologii iCloudu:
- Úložiště klíč-hodnota iCloudu – asynchronně udržuje malé množství dat aktuální a je skvělé pro práci s předvolbami aplikací. Je však omezena na velmi malé množství informací.
- iCloud Drive – postavený na stávajících rozhraních API dokumentů iCloudu a poskytuje jednoduché rozhraní API pro synchronizaci nestrukturovaných dat ze systému souborů. Poskytuje úplnou offline mezipaměť v systému Mac OS X a je skvělá pro aplikace zaměřené na dokumenty.
- iCloud Core Data – Umožňuje replikaci dat mezi všemi zařízeními uživatele. Data jsou jednouživatelé a skvěle se hodí pro zachování privátních strukturovaných dat v synchronizaci.
- CloudKit – Poskytuje strukturu veřejných dat i hromadnou strukturu a umožňuje zpracovávat velké datové sady i velké nestrukturované soubory. Je svázaný s účtem iCloud uživatele a poskytuje klientský přenos dat směrovaný klientem.
Mějte na paměti tyto případy použití, vývojář by měl vybrat správnou technologii iCloud, aby poskytoval aktuální požadované funkce aplikace a poskytoval dobrou škálovatelnost pro budoucí růst.
Shrnutí
Tento článek se zabývá rychlým úvodem k rozhraní CLOUDKit API. Ukázalo se, jak zřídit a nakonfigurovat aplikaci Xamarin pro iOS tak, aby používala CloudKit. Probrala funkce rozhraní API CloudKit Convenience. Ukazuje, jak navrhnout aplikaci s podporou CloudKitu pro zajištění škálovatelnosti pomocí dotazů a předplatných. A nakonec se zobrazily informace o uživatelském účtu, které je vystavené aplikaci CloudKitem.