Verwenden von iCloud mit Xamarin.iOS

Mit der iCloud-Speicher-API in iOS 5 können Anwendungen Benutzerdokumente und anwendungsspezifische Daten an einem zentralen Ort speichern und von allen Geräten des Benutzers auf diese Elemente zugreifen.

Es sind vier Arten von Speicher verfügbar:

  • Schlüssel-Wert-Speicher: Um kleine Datenmengen für Ihre Anwendung auf den anderen Geräten eines Benutzers freizugeben.

  • UIDocument-Speicher: Zum Speichern von Dokumenten und anderen Daten im iCloud-Konto des Benutzers mithilfe einer Unterklasse von UIDocument.

  • CoreData: SQLite-Datenbankspeicher.

  • Einzelne Dateien und Verzeichnisse: Zum Verwalten vieler verschiedener Dateien direkt im Dateisystem.

In diesem Dokument werden die ersten beiden Typen – Key-Value-Paare und UIDocument-Unterklassen – und die Verwendung dieser Features in Xamarin.iOS erläutert.

Wichtig

Apple stellt Tools zur Verfügung, die Entwickler dabei unterstützen, die Datenschutz-Grundverordnung (DSGVO) der Europäischen Union umzusetzen.

Anforderungen

  • Die neueste stabile Version von Xamarin.iOS
  • Xcode 10
  • Visual Studio für Mac oder Visual Studio 2019.

Vorbereiten der iCloud-Entwicklung

Anwendungen müssen für die Verwendung von iCloud sowohl im Apple-Bereitstellungsportal als auch im Projekt selbst konfiguriert werden. Bevor Sie für iCloud entwickeln (oder die Beispiele ausprobieren), führen Sie die folgenden Schritte aus.

So konfigurieren Sie eine Anwendung ordnungsgemäß für den Zugriff auf iCloud:

  • Suchen Sie Ihre TeamID: Melden Sie sich bei developer.apple.com an, und besuchen Sie die Zusammenfassung ihres Kontoentwicklerkontos im Member Center, um Ihre Team-ID (oder individuelle ID für einzelne Entwickler) abzurufen. Dabei handelt es sich um eine 10-stellige Zeichenfolge (z.B. A93A5CM278), die Teil des "Containerbezeichners" ist.

  • Erstellen einer neuen App-ID: Führen Sie zum Erstellen einer App-ID die Schritte aus, die im Abschnitt Bereitstellung für Store Technologien des Leitfadenszur Gerätebereitstellung beschrieben sind, und überprüfen Sie iCloud als zulässigen Dienst:

Überprüfen von iCloud als zulässiger Dienst

  • Erstellen eines neuen Bereitstellungsprofils: Um ein Bereitstellungsprofil zu erstellen, führen Sie die Schritte aus, die im Leitfaden zur Gerätebereitstellung beschrieben sind.

  • Fügen Sie entitlements.plist den Containerbezeichner hinzu. Das Containerbezeichnerformat ist . Weitere Informationen finden Sie im Leitfaden Arbeiten mit Berechtigungen.

  • Konfigurieren der Projekteigenschaften: Stellen Sie in der Datei Info.plist sicher, dass der Bündelbezeichner mit der beim Erstellen einer App-IDfestgelegten Bündel-ID übereinstimmt. Die iOS-Bundlesignierung verwendet ein Bereitstellungsprofil, das eine App-ID mit dem iCloud-App Service und der ausgewählten Datei "Benutzerdefinierte Berechtigungen" enthält. Dies alles kann in Visual Studio im Bereich Eigenschaften des Projekts erfolgen.

  • iCloud auf Ihrem Gerät aktivieren: Wechseln Sie zu Einstellungen iCloud, und stellen Sie sicher, dass das Gerät angemeldet ist. Wählen Sie die Option Dokumentdaten aus, und aktivieren Sie sie.

  • Sie müssen ein Gerät verwenden, um iCloud zu testen. Es funktioniert nicht im Simulator. Tatsächlich benötigen Sie zwei oder mehr Geräte, die alle mit der gleichen Apple-ID angemeldet sind, um iCloud in Aktion zu sehen.

Key-Value Storage

Der Schlüssel-Wert-Speicher ist für kleine Datenmengen bestimmt, die ein Benutzer möglicherweise geräteübergreifend beibehalten möchte, z. B. die letzte Seite, die er in einem Buch oder Einer Magazine angezeigt hat. Schlüssel-Wert-Speicher sollte nicht zum Sichern von Daten verwendet werden.

Bei der Verwendung von Schlüssel-Wert-Speicher sind einige Einschränkungen zu beachten:

  • Maximale Schlüsselgröße: Schlüsselnamen dürfen nicht länger als 64 Bytes sein.

  • Maximale Wertgröße: Sie können nicht mehr als 64 Kilobytes in einem einzelnen Wert speichern.

  • Maximale Größe des Schlüssel-Wert-Speichers für eine App: Anwendungen können insgesamt nur bis zu 64 KILOBYTE an Schlüssel-Wert-Daten speichern. Versuche, Schlüssel über diesen Grenzwert hinaus festzulegen, schlagen fehl, und der vorherige Wert bleibt erhalten.

  • Datentypen: Es können nur grundlegende Typen wie Zeichenfolgen, Zahlen und boolesche Werte gespeichert werden.

Das iCloudKeyValue-Beispiel veranschaulicht die Funktionsweise. Der Beispielcode erstellt einen Schlüssel namens für jedes Gerät: Sie können diesen Schlüssel auf einem Gerät festlegen und beobachten, wie der Wert an andere weitergegeben wird. Außerdem wird ein Schlüssel namens "Shared" erstellt, der auf jedem Gerät bearbeitet werden kann. Wenn Sie auf vielen Geräten gleichzeitig bearbeiten, entscheidet iCloud, welcher Wert "gewinnt" (mithilfe eines Zeitstempels bei der Änderung) und weitergegeben wird.

Dieser Screenshot zeigt das verwendete Beispiel. Wenn Änderungsbenachrichtigungen von iCloud empfangen werden, werden sie in der Bildlauftextansicht am unteren Bildschirmrand ausgegeben und in den Eingabefeldern aktualisiert.

Nachrichtenfluss zwischen Geräten

Festlegen und Abrufen von Daten

Dieser Code zeigt, wie ein Zeichenfolgenwert festgelegt wird.

var store = NSUbiquitousKeyValueStore.DefaultStore;
store.SetString("testkey", "VALUE IN THE CLOUD");  // key and value
store.Synchronize();

Durch das Aufrufen von Synchronize wird sichergestellt, dass der Wert nur im lokalen Datenträgerspeicher beibehalten wird. Die Synchronisierung mit iCloud erfolgt im Hintergrund und kann nicht durch Anwendungscode "erzwungen" werden. Bei guter Netzwerkkonnektivität erfolgt die Synchronisierung häufig innerhalb von 5 Sekunden. Wenn das Netzwerk jedoch schlecht ist (oder getrennt ist), kann ein Update viel länger dauern.

Sie können einen Wert mit diesem Code abrufen:

var store = NSUbiquitousKeyValueStore.DefaultStore;
display.Text = store.GetString("testkey");

Der Wert wird aus dem lokalen Datenspeicher abgerufen. Diese Methode versucht nicht, sich an iCloud-Server zu wenden, um den "neuesten" Wert zu erhalten. iCloud aktualisiert den lokalen Datenspeicher gemäß einem eigenen Zeitplan.

Löschen von Daten

Um ein Schlüssel-Wert-Paar vollständig zu entfernen, verwenden Sie die Remove-Methode wie folgt:

var store = NSUbiquitousKeyValueStore.DefaultStore;
store.Remove("testkey");
store.Synchronize();

Beobachten von Änderungen

Eine Anwendung kann auch Benachrichtigungen empfangen, wenn Werte von iCloud geändert werden, indem der ein Beobachter hinzugefügt NSNotificationCenter.DefaultCenter wird. Der folgende Code der KeyValueViewController.cs-Methode zeigt, wie Sie auf diese Benachrichtigungen lauschen und eine Liste mit den geänderten Schlüsseln erstellen:

keyValueNotification =
NSNotificationCenter.DefaultCenter.AddObserver (
    NSUbiquitousKeyValueStore.DidChangeExternallyNotification, notification => {
    Console.WriteLine ("Cloud notification received");
    NSDictionary userInfo = notification.UserInfo;

    var reasonNumber = (NSNumber)userInfo.ObjectForKey (NSUbiquitousKeyValueStore.ChangeReasonKey);
    nint reason = reasonNumber.NIntValue;

    var changedKeys = (NSArray)userInfo.ObjectForKey (NSUbiquitousKeyValueStore.ChangedKeysKey);
    var changedKeysList = new List<string> ();
    for (uint i = 0; i < changedKeys.Count; i++) {
        var key = changedKeys.GetItem<NSString> (i); // resolve key to a string
        changedKeysList.Add (key);
    }
    // now do something with the list...
});

Ihr Code kann dann eine Aktion mit der Liste der geänderten Schlüssel ausführen, z. B. das Aktualisieren einer lokalen Kopie dieser Schlüssel oder das Aktualisieren der Benutzeroberfläche mit den neuen Werten.

Mögliche Änderungsgründe sind: ServerChange (0), InitialSyncChange (1) oder QuotaViolationChange (2). Sie können auf den Grund zugreifen und bei Bedarf eine andere Verarbeitung durchführen (z. B. müssen Sie möglicherweise einige Schlüssel aufgrund einer QuotaViolationChangeentfernen).

Dokument Storage

iCloud Document Storage ist für die Verwaltung von Daten konzipiert, die für Ihre App (und den Benutzer) wichtig sind. Sie kann verwendet werden, um Dateien und andere Daten zu verwalten, die Ihre App ausführen muss, während gleichzeitig iCloud-basierte Sicherungs- und Freigabefunktionen für alle Geräte des Benutzers zur Verfügung stehen.

Dieses Diagramm zeigt, wie alles zusammenpasst. Jedes Gerät verfügt über Daten, die im lokalen Speicher (UbiquityContainer) gespeichert sind, und der iCloud-Daemon des Betriebssystems übernimmt das Senden und Empfangen von Daten in der Cloud. Der gesamte Dateizugriff auf den UbiquityContainer muss über FilePresenter/FileCoordinator erfolgen, um gleichzeitigen Zugriff zu verhindern. Die UIDocument -Klasse implementiert diese für Sie. In diesem Beispiel wird die Verwendung von UIDocument veranschaulicht.

Übersicht über den Dokumentspeicher

Im iCloudUIDoc-Beispiel wird eine einfache UIDocument Unterklasse implementiert, die ein einzelnes Textfeld enthält. Der Text wird in einem gerendert, UITextView und Bearbeitungen werden von iCloud mit einer rot dargestellten Benachrichtigung an andere Geräte weitergegeben. Der Beispielcode befasst sich nicht mit komplexeren iCloud-Features wie der Konfliktlösung.

Dieser Screenshot zeigt die Beispielanwendung: Nach dem Ändern des Texts und dem Drücken von UpdateChangeCount wird das Dokument über iCloud mit anderen Geräten synchronisiert.

Dieser Screenshot zeigt die Beispielanwendung nach dem Ändern des Texts und dem Drücken von UpdateChangeCount.

Das iCloudUIDoc-Beispiel besteht aus fünf Teilen:

  1. Zugreifen auf den UbiquityContainer: Bestimmen Sie, ob iCloud aktiviert ist, und wenn ja, der Pfad zum iCloud-Speicherbereich Ihrer Anwendung.

  2. Erstellen einer UIDocument-Unterklasse: Erstellen Sie eine Klasse für die Zwischenstufe zwischen iCloud-Speicher und Ihren Modellobjekten.

  3. Suchen und Öffnen von iCloud-Dokumenten: Verwenden Sie und , um NSPredicate iCloud-Dokumente zu suchen und zu öffnen.

  4. Anzeigen von iCloud-Dokumenten: Machen Sie Eigenschaften von verfügbar, damit Sie mit Ui-Steuerelementen interagieren können.

  5. Speichern von iCloud-Dokumenten: Stellen Sie sicher, dass die auf der Benutzeroberfläche vorgenommenen Änderungen auf dem Datenträger und in iCloud beibehalten werden.

Alle iCloud-Vorgänge werden asynchron ausgeführt (oder sollten asynchron ausgeführt werden), damit sie nicht blockiert werden, während darauf gewartet wird, dass etwas passiert. Im Beispiel sehen Sie drei verschiedene Möglichkeiten, dies zu erreichen:

Threads: Im ersten Aufruf von GetUrlForUbiquityContainer erfolgt in einem anderen Thread, um zu verhindern, dass der Hauptthread blockiert wird.

NotificationCenter: Registrierung für Benachrichtigungen, wenn asynchrone Vorgänge wie abgeschlossen sind.

Vervollständigungshandler: Übergeben von Methoden zur Ausführung nach Abschluss asynchroner Vorgänge wie .

Zugreifen auf den UbiquityContainer

Der erste Schritt bei der Verwendung von iCloud Document Storage besteht darin, zu bestimmen, ob iCloud aktiviert ist und wenn ja, der Speicherort des "Ubiquity-Containers" (das Verzeichnis, in dem iCloud-fähige Dateien auf dem Gerät gespeichert werden).

Dieser Code befindet sich in der AppDelegate.FinishedLaunching -Methode des Beispiels.

// GetUrlForUbiquityContainer is blocking, Apple recommends background thread or your UI will freeze
ThreadPool.QueueUserWorkItem (_ => {
    CheckingForiCloud = true;
    Console.WriteLine ("Checking for iCloud");
    var uburl = NSFileManager.DefaultManager.GetUrlForUbiquityContainer (null);
    // OR instead of null you can specify "TEAMID.com.your-company.ApplicationName"

    if (uburl == null) {
        HasiCloud = false;
        Console.WriteLine ("Can't find iCloud container, check your provisioning profile and entitlements");

        InvokeOnMainThread (() => {
            var alertController = UIAlertController.Create ("No \uE049 available",
            "Check your Entitlements.plist, BundleId, TeamId and Provisioning Profile!", UIAlertControllerStyle.Alert);
            alertController.AddAction (UIAlertAction.Create ("OK", UIAlertActionStyle.Destructive, null));
            viewController.PresentViewController (alertController, false, null);
        });
    } else { // iCloud enabled, store the NSURL for later use
        HasiCloud = true;
        iCloudUrl = uburl;
        Console.WriteLine ("yyy Yes iCloud! {0}", uburl.AbsoluteUrl);
    }
    CheckingForiCloud = false;
});

Obwohl dies im Beispiel nicht der Fall ist, empfiehlt Apple, GetUrlForUbiquityContainer aufzurufen, wenn eine App in den Vordergrund kommt.

Erstellen einer UIDocument-Unterklasse

Alle iCloud-Dateien und -Verzeichnisse (d. h. alle im Verzeichnis UbiquityContainer gespeicherten Dateien und Verzeichnisse) müssen mit NSFileManager-Methoden verwaltet werden, das NSFilePresenter-Protokoll implementieren und über einen NSFileCoordinator schreiben. Die einfachste Möglichkeit, all dies zu tun, besteht nicht darin, es selbst zu schreiben, sondern die Unterklasse UIDocument, die alles für Sie übernimmt.

Es gibt nur zwei Methoden, die Sie in einer UIDocument-Unterklasse implementieren müssen, um mit iCloud zu arbeiten:

  • LoadFromContents: Übergibt die NSData des Dateiinhalts, damit Sie sie in Ihre Modellklasse/-klassen entpacken können.

  • ContentsForType: Fordern Sie auf, die NSData-Darstellung Ihrer Modellklasse/-en zum Speichern auf dem Datenträger (und in der Cloud) zur Verfügung zu stellen.

Dieser Beispielcode aus iCloudUIDoc\MonkeyDocument.cs zeigt, wie UIDocument implementiert wird.

public class MonkeyDocument : UIDocument
{
    // the 'model', just a chunk of text in this case; must easily convert to NSData
    NSString dataModel;
    // model is wrapped in a nice .NET-friendly property
    public string DocumentString {
        get {
            return dataModel.ToString ();
        }
        set {
            dataModel = new NSString (value);
        }
    }
    public MonkeyDocument (NSUrl url) : base (url)
    {
        DocumentString = "(default text)";
    }
    // contents supplied by iCloud to display, update local model and display (via notification)
    public override bool LoadFromContents (NSObject contents, string typeName, out NSError outError)
    {
        outError = null;

        Console.WriteLine ("LoadFromContents({0})", typeName);

        if (contents != null)
            dataModel = NSString.FromData ((NSData)contents, NSStringEncoding.UTF8);

        // LoadFromContents called when an update occurs
        NSNotificationCenter.DefaultCenter.PostNotificationName ("monkeyDocumentModified", this);
        return true;
    }
    // return contents for iCloud to save (from the local model)
    public override NSObject ContentsForType (string typeName, out NSError outError)
    {
        outError = null;

        Console.WriteLine ("ContentsForType({0})", typeName);
        Console.WriteLine ("DocumentText:{0}",dataModel);

        NSData docData = dataModel.Encode (NSStringEncoding.UTF8);
        return docData;
    }
}

Das Datenmodell ist in diesem Fall sehr einfach: ein einzelnes Textfeld. Ihr Datenmodell kann so komplex wie erforderlich sein, z. B. ein XML-Dokument oder Binärdaten. Die primäre Rolle der UIDocument-Implementierung besteht darin, zwischen Ihren Modellklassen und einer NSData-Darstellung zu übersetzen, die auf dem Datenträger gespeichert/geladen werden kann.

Suchen und Öffnen von iCloud-Dokumenten

Die Beispiel-App verarbeitet nur eine einzelne Datei ( test.txt ), sodass der Code in AppDelegate.cs eine erstellt und speziell nach diesem NSMetadataQuery Dateinamen sucht. Die NSMetadataQuery wird asynchron ausgeführt und sendet eine Benachrichtigung, wenn sie abgeschlossen ist. DidFinishGathering wird vom Benachrichtigungsbeoschützer aufgerufen, beendet die Abfrage und ruft LoadDocument auf. Dabei wird die UIDocument.Open -Methode mit einem Vervollständigungshandler verwendet, um zu versuchen, die Datei zu laden und in einem MonkeyDocumentViewController anzuzeigen.

string monkeyDocFilename = "test.txt";
void FindDocument ()
{
    Console.WriteLine ("FindDocument");
    query = new NSMetadataQuery {
        SearchScopes = new NSObject [] { NSMetadataQuery.UbiquitousDocumentsScope }
    };

    var pred = NSPredicate.FromFormat ("%K == %@", new NSObject[] {
        NSMetadataQuery.ItemFSNameKey, new NSString (MonkeyDocFilename)
    });

    Console.WriteLine ("Predicate:{0}", pred.PredicateFormat);
    query.Predicate = pred;

    NSNotificationCenter.DefaultCenter.AddObserver (
        this,
        new Selector ("queryDidFinishGathering:"),
        NSMetadataQuery.DidFinishGatheringNotification,
        query
    );

    query.StartQuery ();
}

[Export ("queryDidFinishGathering:")]
void DidFinishGathering (NSNotification notification)
{
    Console.WriteLine ("DidFinishGathering");
    var metadataQuery = (NSMetadataQuery)notification.Object;
    metadataQuery.DisableUpdates ();
    metadataQuery.StopQuery ();

    NSNotificationCenter.DefaultCenter.RemoveObserver (this, NSMetadataQuery.DidFinishGatheringNotification, metadataQuery);
    LoadDocument (metadataQuery);
}

void LoadDocument (NSMetadataQuery metadataQuery)
{
    Console.WriteLine ("LoadDocument");

    if (metadataQuery.ResultCount == 1) {
        var item = (NSMetadataItem)metadataQuery.ResultAtIndex (0);
        var url = (NSUrl)item.ValueForAttribute (NSMetadataQuery.ItemURLKey);
        doc = new MonkeyDocument (url);

        doc.Open (success => {
            if (success) {
                Console.WriteLine ("iCloud document opened");
                Console.WriteLine (" -- {0}", doc.DocumentString);
                viewController.DisplayDocument (doc);
            } else {
                Console.WriteLine ("failed to open iCloud document");
            }
        });
    } // TODO: if no document, we need to create one
}

Anzeigen von iCloud-Dokumenten

Das Anzeigen eines UIDocument sollte sich nicht von anderen Modellklassen unterscheiden. Eigenschaften werden in UI-Steuerelementen angezeigt, möglicherweise vom Benutzer bearbeitet und dann in das Modell zurückgeschrieben.

Im Beispiel zeigt iCloudUIDoc\MonkeyDocumentViewController.cs den MonkeyDocument-Text in einem an. ViewDidLoad lauscht auf die in der -Methode gesendete MonkeyDocument.LoadFromContents Benachrichtigung. LoadFromContents wird aufgerufen, wenn iCloud über neue Daten für die Datei verfügt, sodass die Benachrichtigung angibt, dass das Dokument aktualisiert wurde.

NSNotificationCenter.DefaultCenter.AddObserver (this,
    new Selector ("dataReloaded:"),
    new NSString ("monkeyDocumentModified"),
    null
);

Der Beispielcodebenachrichtigungshandler ruft eine Methode auf, um die Benutzeroberfläche zu aktualisieren – in diesem Fall ohne Konflikterkennung oder -lösung.

[Export ("dataReloaded:")]
void DataReloaded (NSNotification notification)
{
    doc = (MonkeyDocument)notification.Object;
    // we just overwrite whatever was being typed, no conflict resolution for now
    docText.Text = doc.DocumentString;
}

Speichern von iCloud-Dokumenten

Um iCloud ein UIDocument hinzuzufügen, können Sie direkt aufrufen UIDocument.Save (nur für neue Dokumente) oder eine vorhandene Datei mit NSFileManager.DefaultManager.SetUbiquitious verschieben. Der Beispielcode erstellt ein neues Dokument direkt im Ubiquity-Container mit diesem Code (hier gibt es zwei Vervollständigungshandler, einen für den Save Vorgang und einen für open):

var docsFolder = Path.Combine (iCloudUrl.Path, "Documents"); // NOTE: Documents folder is user-accessible in Settings
var docPath = Path.Combine (docsFolder, MonkeyDocFilename);
var ubiq = new NSUrl (docPath, false);
var monkeyDoc = new MonkeyDocument (ubiq);
monkeyDoc.Save (monkeyDoc.FileUrl, UIDocumentSaveOperation.ForCreating, saveSuccess => {
Console.WriteLine ("Save completion:" + saveSuccess);
if (saveSuccess) {
    monkeyDoc.Open (openSuccess => {
        Console.WriteLine ("Open completion:" + openSuccess);
        if (openSuccess) {
            Console.WriteLine ("new document for iCloud");
            Console.WriteLine (" == " + monkeyDoc.DocumentString);
            viewController.DisplayDocument (monkeyDoc);
        } else {
            Console.WriteLine ("couldn't open");
        }
    });
} else {
    Console.WriteLine ("couldn't save");
}

Nachfolgende Änderungen am Dokument werden nicht direkt "gespeichert". Stattdessen teilen wir dem UIDocument mit mit, dass es geändert UpdateChangeCount wurde, und es wird automatisch ein Speichervorgang auf dem Datenträger geplant:

doc.UpdateChangeCount (UIDocumentChangeKind.Done);

Verwalten von iCloud-Dokumenten

Benutzer können iCloud-Dokumente im Verzeichnis Dokumente des "Ubiquity-Containers" außerhalb Ihrer Anwendung über Einstellungen verwalten. Sie können die Dateiliste anzeigen und zum Löschen wischen. Anwendungscode sollte in der Lage sein, die Situation zu behandeln, in der Dokumente vom Benutzer gelöscht werden. Speichern Sie keine internen Anwendungsdaten im Verzeichnis Dokumente.

Verwalten des Workflows für iCloud-Dokumente

Benutzer erhalten auch unterschiedliche Warnungen, wenn sie versuchen, eine iCloud-fähige Anwendung von ihrem Gerät zu entfernen, um sie über den Status von iCloud-Dokumenten im Zusammenhang mit dieser Anwendung zu informieren.

Screenshot: Warnung zu ausstehenden Dokumentupdates

Screenshot: Warnung für

iCloud-Sicherung

Die Sicherung in iCloud ist zwar kein Feature, auf das Entwickler direkt zugreifen, aber die Art und Weise, wie Sie Ihre Anwendung entwerfen, kann sich auf die Benutzererfahrung auswirken. Apple stellt iOS Data Storage Guidelines für Entwickler bereit, die sie in ihren iOS-Anwendungen befolgen können.

Der wichtigste Aspekt ist, ob Ihre App große Dateien speichert, die nicht vom Benutzer generiert werden (z. B. eine Magazine reader-Anwendung, in der pro Problem mehrere hundert Megabyte an Inhalten gespeichert werden). Apple zieht es vor, diese Art von Daten nicht dort zu speichern, wo sie in iCloud gesichert werden, und das iCloud-Kontingent des Benutzers unnötig zu erfüllen.

Anwendungen, die große Datenmengen wie diese speichern, sollten sie entweder in einem der Benutzerverzeichnisse speichern, die nicht gesichert sind (z. B. Caches oder TMP) oder NSFileManager.SetSkipBackupAttribute verwenden, um ein Flag auf diese Dateien anzuwenden, sodass iCloud sie bei Sicherungsvorgängen ignoriert.

Zusammenfassung

In diesem Artikel wurde das neue iCloud-Feature eingeführt, das in iOS 5 enthalten ist. Es wurden die Schritte untersucht, die zum Konfigurieren Ihres Projekts für die Verwendung von iCloud erforderlich sind, und es wurden Beispiele für die Implementierung von iCloud-Features bereitgestellt.

Das Schlüssel-Wert-Speicherbeispiel veranschaulichte, wie iCloud verwendet werden kann, um eine kleine Datenmenge ähnlich der Art und Weise zu speichern, wie NSUserPreferences gespeichert werden. Im UIDocument-Beispiel wurde gezeigt, wie komplexere Daten über iCloud auf mehreren Geräten gespeichert und synchronisiert werden können.

Schließlich wurde kurz erläutert, wie sich das Hinzufügen von iCloud Backup auf den Anwendungsentwurf auswirken sollte.