Verwenden von icloud mit xamarin. IOSUsing iCloud with Xamarin.iOS

Mit der icloud-Speicher-API in ios 5 können Anwendungen Benutzer Dokumente und anwendungsspezifische Daten an einem zentralen Speicherort speichern und von allen Geräten des Benutzers aus auf diese Elemente zugreifen.The iCloud storage API in iOS 5 allows applications to save user documents and application-specific data to a central location and access those items from all the user's devices.

Es stehen vier Arten von Speicher zur Verfügung:There are four types of storage available:

  • Schlüssel-Wert-Speicher : um kleine Datenmengen mit Ihrer Anwendung auf den anderen Geräten eines Benutzers freizugeben.Key-Value storage - to share small amounts of data with your application on a user's other devices.

  • Uidocument-Speicher : zum Speichern von Dokumenten und anderen Daten im icloud-Konto des Benutzers mithilfe einer Unterklasse von uidocument.UIDocument storage - to store documents and other data in the user's iCloud account using a subclass of UIDocument.

  • CoreData -SQLite-Daten Bank Speicher.CoreData - SQLite database storage.

  • Einzelne Dateien und Verzeichnisse : zum Verwalten von vielen unterschiedlichen Dateien direkt im Dateisystem.Individual files and directories - for managing lots of different files directly in the file system.

In diesem Dokument werden die ersten beiden Typen: Schlüssel-Wert-Paare und uidocument-Unterklassen erläutert und erläutert, wie diese Funktionen in xamarin. IOS verwendet werden.This document discusses the first two types - Key-Value pairs and UIDocument subclasses - and how to use those features in Xamarin.iOS.

Wichtig

Apple stellt Tools zur Verfügung, die Entwickler dabei unterstützen, die Datenschutz-Grundverordnung (DSGVO) der Europäischen Union umzusetzen.Apple provides tools to help developers properly handle the European Union's General Data Protection Regulation (GDPR).

AnforderungenRequirements

  • Die neueste stabile Version von xamarin. IOSThe latest stable version of Xamarin.iOS
  • Xcode 10Xcode 10
  • Visual Studio für Mac oder Visual Studio 2019.Visual Studio for Mac or Visual Studio 2019.

Vorbereiten der icloud-EntwicklungPreparing for iCloud development

Anwendungen müssen für die Verwendung von icloud sowohl im Apple-Bereitstellungs Portal als auch im Projekt selbst konfiguriert werden.Applications must be configured to use iCloud both in the Apple Provisioning Portal and the project itself. Führen Sie die folgenden Schritte aus, bevor Sie für icloud entwickeln (oder die Beispiele ausprobieren).Before developing for iCloud (or trying out the samples) follow the steps below.

So konfigurieren Sie eine Anwendung für den Zugriff auf icloud ordnungsgemäß:To correctly configure an application to access iCloud:

  • Suchen Sie Ihre Team-ID für Developer.Apple.com , und besuchen Sie das Mitglied Center > Ihrem Konto > Entwicklerkonto Zusammenfassung , um Ihre Team-ID (oder die individuelle ID für einzelne Entwickler) zu erhalten.Find your TeamID - login to developer.apple.com and visit the Member Center > Your Account > Developer Account Summary to get your Team ID (or Individual ID for single developers). Dabei handelt es sich um eine Zeichenfolge mit 10 Zeichen (z. b. A93A5CM278 ), die Teil des "Container Bezeichners" ist.It will be a 10 character string ( A93A5CM278 for example) - this forms part of the "container identifier".

  • Erstellen einer neuen APP-ID : um eine APP-ID zu erstellen, führen Sie die Schritte aus, die im Abschnitt Bereitstellung für Store-Technologien im Handbuch zur Geräte Bereitstellungbeschrieben werden, und stellen Sie sicher, dass Sie icloud als zulässigen Dienst überprüfen:Create a new App ID - To create an App ID, follow the steps outlined in the Provisioning for Store Technologies section of the Device Provisioning guide, and be sure to check iCloud as an allowed service:

Icloud als zulässigen Dienst überprüfenCheck iCloud as an allowed service

  • Erstellen eines neuen Bereitstellungs Profils : führen Sie zum Erstellen eines Bereitstellungs Profils die im Handbuch zur Geräte Bereitstellung beschriebenen Schritte aus.Create a new Provisioning Profile - To create a Provisioning Profile, follow the steps outlined in the Device Provisioning guide .

  • Fügen Sie den Container Bezeichner zu "Berechtigungen. plist" hinzu -das Container-Bezeichnerformat ist TeamID.BundleID .Add the Container Identifier to Entitlements.plist - the container identifier format is TeamID.BundleID. Weitere Informationen finden Sie im Handbuch Arbeiten mit Berechtigungen .For more information refer to the Working with Entitlements guide.

  • Konfigurieren Sie die Projekteigenschaften : Stellen Sie in der Datei "Info. plist" sicher, dass die Bündel -ID mit der Paket-ID übereinstimmt, wenn Sie eine APP Beim Signieren des IOS-Pakets wird ein Bereitstellungs Profil verwendet, das eine APP-ID mit dem icloud-App Service und die ausgewählte Datei mit den benutzerdefinierten Berechtigungen enthält.Configure the project properties - In the Info.plist file ensure the Bundle Identifier matches the Bundle ID set when creating an App ID; The iOS Bundle Signing uses a Provisioning Profile that contain an App ID with the iCloud App Service, and the Custom Entitlements file selected. Dies kann in Visual Studio unter dem Projekteigenschaften Bereich erfolgen.This can all be done in Visual Studio under the project Properties pane.

  • Aktivieren von icloud auf Ihrem Gerät : Wechseln Sie zu Einstellungen > icloud , und stellen Sie sicher, dass das Gerät angemeldet ist.Enable iCloud on your device - go to Settings > iCloud and ensure that the device is logged in. Aktivieren und aktivieren Sie die Option Dokumente & Daten .Select and turn on the Documents & Data option.

  • Sie müssen ein Gerät zum Testen von icloud verwenden . es funktioniert nicht im Simulator.You must use a device to test iCloud - it will not work on the Simulator. Tatsächlich benötigen Sie tatsächlich zwei oder mehr Geräte, die alle mit derselben Apple-ID angemeldet sind, um die icloud in Aktion zu sehen.In fact, you really need two or more devices all signed in with the same Apple ID to see iCloud in action.

Schlüssel-Wert-SpeicherKey-Value Storage

Der Schlüssel-Wert-Speicher ist für kleine Datenmengen vorgesehen, die ein Benutzer auf Geräten beibehalten kann, z. b. auf der letzten Seite, die in einem Buch oder Magazin angezeigt wird.Key-value storage is intended for small amounts of data that a user might like persisted across devices - such as the last page they viewed in a book or magazine. Der Schlüssel-Wert-Speicher sollte nicht zum Sichern von Daten verwendet werden.Key-value storage should not be used for backing-up data.

Bei der Verwendung von Schlüssel-Wert-Speicher sind einige Einschränkungen zu beachten:There are some limitations to be aware of when using key-value storage:

  • Maximale Schlüsselgröße : Schlüsselnamen dürfen nicht länger als 64 Bytes sein.Maximum key size - Key names cannot be longer than 64 bytes.

  • Maximale Werte Größe : Sie können nicht mehr als 64 Kilobyte in einem einzelnen Wert speichern.Maximum value size - You cannot store more than 64 kilobytes in a single value.

  • Die maximale Größe des Schlüsselwert Speicher für eine APP -Anwendung kann insgesamt bis zu 64 Kilobyte an Schlüssel-Wert-Daten speichern.Maximum key-value store size for an app - Applications can only store up to 64 kilobytes of key-value data in total. Versuche, über diesen Grenzwert hinausgehende Schlüssel festzulegen, schlagen fehl, und der vorherige Wert bleibt erhalten.Attempts to set keys beyond that limit will fail and the previous value will persist.

  • Datentypen : nur grundlegende Typen wie Zeichen folgen, Zahlen und boolesche Werte können gespeichert werden.Data types - Only basic types like strings, numbers and booleans can be stored.

Das icloudkeyvalue -Beispiel veranschaulicht, wie es funktioniert.The iCloudKeyValue example demonstrates how it works. Der Beispielcode erstellt einen Schlüssel mit dem Namen für jedes Gerät: Sie können diesen Schlüssel auf einem Gerät festlegen und beobachten, wie der Wert an andere Personen weitergegeben wird.The sample code creates a key named for each device: you can set this key on one device and watch the value get propagated to others. Außerdem wird ein Schlüssel mit dem Namen "Shared" erstellt, der auf jedem Gerät bearbeitet werden kann. Wenn Sie auf vielen Geräten gleichzeitig bearbeiten, entscheidet icloud, welcher Wert "WINS" (mit einem Zeitstempel für die Änderung) und weitergegeben wird.It also creates a key called "Shared" which can be edited on any device - if you edit on many devices at once, iCloud will decide which value "wins" (using a timestamp on the change) and gets propagated.

Dieser Screenshot zeigt das verwendete Beispiel.This screenshot shows the sample in use. Wenn Änderungs Benachrichtigungen von icloud empfangen werden, werden Sie in der Bild Lauf Textansicht am unteren Bildschirmrand gedruckt und in den Eingabefeldern aktualisiert.When change notifications are received from iCloud they are printed in the scrolling text view at the bottom of the screen and updated in the input fields.

Der Nachrichtenfluss zwischen GerätenThe flow of messages between devices

Festlegen und Abrufen von DatenSetting and retrieving data

In diesem Code wird gezeigt, wie ein Zeichen folgen Wert festgelegt wird.This code shows how to set a string value.

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

Durch den Aufruf von Synchronisierung wird sichergestellt, dass der Wert nur im lokalen Speicher gespeichert wirdCalling Synchronize ensures the value is persisted to local disk storage only. Die Synchronisierung mit icloud erfolgt im Hintergrund und kann vom Anwendungscode nicht "erzwungen" werden.The synchronization to iCloud happens in the background and cannot be "forced" by application code. Bei einer guten Netzwerk Konnektivität wird die Synchronisierung oft innerhalb von 5 Sekunden durchgeführt. wenn das Netzwerk jedoch schlecht (oder getrennt) ist, kann ein Update erheblich länger dauern.With good network connectivity the synchronization will often happen within 5 seconds, however if the network is poor (or disconnected) an update may take much longer.

Mit diesem Code können Sie einen Wert abrufen:You can retrieve a value with this code:

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 Wert "Latest" zu erhalten.The value is retrieved from the local data store - this method does not attempt to contact iCloud servers to get the "latest" value. der lokale Datenspeicher wird von icloud gemäß einem eigenen Zeitplan aktualisiert.iCloud will update the local data store according to its own schedule.

Löschen von DatenDeleting Data

Um ein Schlüssel-Wert-Paar vollständig zu entfernen, verwenden Sie die Remove-Methode wie folgt:To completely remove a key-value pair, use the Remove method like this:

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

Beobachten von ÄnderungenObserving Changes

Eine Anwendung kann auch Benachrichtigungen empfangen, wenn die Werte von icloud geändert werden, indem der ein Beobachter hinzugefügt wird NSNotificationCenter.DefaultCenter .An application can also receive notifications when values are changed by iCloud by adding an observer to the NSNotificationCenter.DefaultCenter. Der folgende Code der KeyValueViewController.cs ViewWillAppear -Methode zeigt, wie Sie diese Benachrichtigungen überwachen und eine Liste der Schlüssel erstellen, die geändert wurden:The following code from KeyValueViewController.cs ViewWillAppear method shows how to listen for those notifications and create a list of which keys have been changed:

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

Der Code kann dann einige Aktionen mit der Liste der geänderten Schlüssel durchführen, z. b. das Aktualisieren einer lokalen Kopie oder das Aktualisieren der Benutzeroberfläche mit den neuen Werten.Your code can then take some action with the list of changed keys, such as updating a local copy of them or updating the UI with the new values.

Mögliche Änderungs Gründe: ServerChange (0), initialsyncchange (1) oder quotaviolationchange (2).Possible change reasons are: ServerChange (0), InitialSyncChange (1), or QuotaViolationChange (2). Sie können auf den Grund zugreifen und ggf. eine andere Verarbeitung durchführen (z. b. müssen Sie einige Schlüssel aufgrund einer quotaviolationchangeentfernen).You can access the reason and perform different processing if required (for example, you might need to remove some keys as a result of a QuotaViolationChange).

Dokument SpeicherDocument Storage

der icloud-Dokument Speicher dient der Verwaltung von Daten, die für Ihre APP (und für den Benutzer) wichtig sind.iCloud Document Storage is designed to manage data that is important to your app (and to the user). Sie kann verwendet werden, um Dateien und andere Daten zu verwalten, die Ihre APP ausführen muss, und gleichzeitig die icloud-basierte Sicherungs-und Freigabe Funktionalität auf allen Geräten des Benutzers bereitzustellen.It can be used to manage files and other data that your app needs to run, while at the same time providing iCloud-based backup and sharing functionality across all the user's devices.

Dieses Diagramm zeigt, wie alles zueinander passt.This diagram shows how it all fits together. Jedes Gerät verfügt über Daten, die im lokalen Speicher (dem "ubiquitycontainer") gespeichert sind, und der icloud-Daemon des Betriebssystems übernimmt das Senden und empfangen von Daten in der Cloud.Each device has data saved on local storage (the UbiquityContainer) and the operating system's iCloud Daemon takes care of sending and receiving data in the cloud. Der gesamte Dateizugriff auf den ubiquitycontainer muss über filepresenter/filecoordinator erfolgen, um den gleichzeitigen Zugriff zu verhindern.All file access to the UbiquityContainer must be done via FilePresenter/FileCoordinator to prevent concurrent access. Die- UIDocument Klasse implementiert diese für Sie. in diesem Beispiel wird die Verwendung von uidocument veranschaulicht.The UIDocument class implements those for you; this example shows how to use UIDocument.

Übersicht über den Dokument SpeicherThe document storage overview

Das iclouduidoc-Beispiel implementiert eine einfache UIDocument Unterklasse, die ein einzelnes Textfeld enthält.The iCloudUIDoc example implements a simple UIDocument subclass that contains a single text field. Der Text wird in einem gerendert, und bearbeitvorgänge UITextView werden von icloud an andere Geräte weitergegeben, wobei eine Benachrichtigungs Meldung rot angezeigt wird.The text is rendered in a UITextView and edits are propagated by iCloud to other devices with a notification message shown in red. Im Beispielcode werden erweiterte icloud-Funktionen wie die Konfliktlösung behandelt.The sample code does not deal with more advanced iCloud features like conflict resolution.

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.This screenshot shows the sample application - after changing the text and pressing UpdateChangeCount the document is synchronized via iCloud to other devices.

Dieser Screenshot zeigt die Beispielanwendung nach dem Ändern des Texts und dem Drücken von updatechangecount.This screenshot shows the sample application after changing the text and pressing UpdateChangeCount

Das iclouduidoc-Beispiel besteht aus fünf Teilen:There are five parts to the iCloudUIDoc sample:

  1. Zugreifen auf den ubiquitycontainer : bestimmen Sie, ob icloud aktiviert ist, und wenn dies der Pfad zum icloud-Speicherbereich Ihrer Anwendung ist.Accessing the UbiquityContainer - determine if iCloud is enabled, and if so the path to your application's iCloud storage area.

  2. Erstellen einer uidocument-Unterklasse : Erstellen Sie eine Klasse, um zwischen dem icloud-Speicher und den Modell Objekten zu Zwischenspeichern.Creating a UIDocument subclass - create a class to intermediate between iCloud storage and your model objects.

  3. Suchen und Öffnen von icloud-Dokumenten : verwenden NSFileManager NSPredicate Sie und, um icloud-Dokumente zu suchen und zu öffnen.Finding and opening iCloud documents - use NSFileManager and NSPredicate to find iCloud documents and open them.

  4. Anzeigen von icloud-Dokumenten : machen Sie Eigenschaften aus dem verfügbar UIDocument , damit Sie mit UI-Steuerelementen interagieren können.Displaying iCloud documents - expose properties from your UIDocument so that you can interact with UI controls.

  5. Speichern von icloud-Dokumenten : Stellen Sie sicher, dass an der Benutzeroberfläche vorgenommene Änderungen auf dem Datenträger und in der icloudSaving iCloud documents - ensure that changes made in the UI are persisted to disk and iCloud.

Alle icloud-Vorgänge werden asynchron ausgeführt (oder sollten ausgeführt werden), sodass Sie nicht blockiert werden, während auf einen Vorgang gewartet wird.All iCloud operations run (or should run) asynchronously so that they don't block while waiting for something to happen. Im Beispiel werden drei verschiedene Möglichkeiten angezeigt, dies zu erreichen:You will see three different ways of accomplishing this in the sample:

Threads : beim AppDelegate.FinishedLaunching ersten-Vorgang wird in GetUrlForUbiquityContainer einem anderen Thread ausgeführt, um zu verhindern, dass der Haupt Thread blockiert wird.Threads - in AppDelegate.FinishedLaunching the initial call to GetUrlForUbiquityContainer is done on another thread to prevent blocking the main thread.

Notificationcenter : Registrierung für Benachrichtigungen, wenn asynchrone Vorgänge wie z NSMetadataQuery.StartQuery . b. beendet werden.NotificationCenter - registering for notifications when asynchronous operations such as NSMetadataQuery.StartQuery complete.

Abschluss Handler : übergeben Sie Methoden, die bei Abschluss von asynchronen Vorgängen wie ausgeführt werden UIDocument.Open .Completion Handlers - passing in methods to run on completion of asynchronous operations like UIDocument.Open.

Zugreifen auf den ' ubiquitycontainer 'Accessing the UbiquityContainer

Der erste Schritt bei der Verwendung des icloud-Dokumenten Speichers besteht darin, zu bestimmen, ob icloud aktiviert ist. wenn dies der Fall ist, wird der Speicherort des "ubiquity-Containers" (das Verzeichnis, in dem icloud-aktivierte Dateien auf dem Gerät gespeichert sind)The first step in using iCloud Document Storage is to determine whether iCloud is enabled, and if so the location of the "ubiquity container" (the directory where iCloud-enabled files are stored on the device).

Dieser Code ist in der- AppDelegate.FinishedLaunching Methode des Beispiels.This code is in the AppDelegate.FinishedLaunching method of the sample.

// 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 das Beispiel dies nicht bewirkt, empfiehlt Apple, immer dann geturlforubiquitycontainer zu aufrufen, wenn eine APP im Vordergrund steht.Although the sample does not do so, Apple recommends calling GetUrlForUbiquityContainer whenever an app comes to the foreground.

Erstellen einer uidocument-UnterklasseCreating a UIDocument Subclass

Alle icloud-Dateien und-Verzeichnisse (d.h. alles, was im Verzeichnis "ubiquitycontainer" gespeichert ist) müssen mithilfe von NSFileManager-Methoden verwaltet werden. dabei wird das nsfilepresenter-Protokoll implementiert und über einen nsfilecoordinator geschrieben.All iCloud files and directories (ie. anything stored in the UbiquityContainer directory) must be managed using NSFileManager methods, implementing the NSFilePresenter protocol and writing via an NSFileCoordinator. Die einfachste Möglichkeit, dies zu tun, ist nicht, Sie selbst zu schreiben, sondern Unterklasse uidocument, was alles für Sie erledigt.The simplest way to do all of that is not to write it yourself, but subclass UIDocument which does it all for you.

Es gibt nur zwei Methoden, die Sie in einer uidocument-Unterklasse implementieren müssen, um mit icloud arbeiten zu können:There are only two methods that you must implement in a UIDocument subclass to work with iCloud:

  • Loadfromcontent : übergibt die NSData des Datei Inhalts, damit Sie Ihre Modellklassen entpacken können.LoadFromContents - passes in the NSData of the file's contents for you to unpack into your model class/es.

  • Contentsfortype : fordern Sie an, dass Sie die NSData-Darstellung Ihrer Modell Klasse/es bereitstellen, die auf dem Datenträger (und in der Cloud) gespeichert werden soll.ContentsForType - request for you to supply the NSData representation of your model class/es to save to disk (and the Cloud).

Dieser Beispielcode von iclouduidoc\monkeydocument.cs zeigt, wie uidocument implementiert wird.This sample code from iCloudUIDoc\MonkeyDocument.cs shows how to implement UIDocument.

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.The data model in this case is very simple - a single text field. Das Datenmodell kann so komplex wie erforderlich sein, z. b. ein XML-Dokument oder Binärdaten.Your data model can be as complex as required, such as an Xml document or binary data. Die primäre Rolle der uidocument-Implementierung besteht darin, zwischen den Modellklassen und einer NSData-Darstellung zu übersetzen, die auf dem Datenträger gespeichert/geladen werden kann.The primary role of the UIDocument implementation is to translate between your model classes and an NSData representation that can be saved/loaded on disk.

Suchen und Öffnen von icloud-DokumentenFinding and Opening iCloud Documents

In der Beispiel-APP wird nur eine einzelne Datei test.txt behandelt, sodass der Code in AppDelegate.cs einen erstellt NSPredicate und NSMetadataQuery speziell nach diesem Dateinamen sucht.The sample app only deals with a single file - test.txt - so the code in AppDelegate.cs creates an NSPredicate and NSMetadataQuery to look specifically for that filename. Die wird NSMetadataQuery asynchron ausgeführt und sendet eine Benachrichtigung, sobald Sie abgeschlossen ist.The NSMetadataQuery runs asynchronously and sends a notification when it finishes. DidFinishGatheringwird vom Benachrichtigungs Beobachter aufgerufen, beendet die Abfrage und ruft LoadDocument auf, das die- UIDocument.Open Methode mit einem Vervollständigungs Handler verwendet, um zu versuchen, die Datei zu laden und in einem anzuzeigen MonkeyDocumentViewController .DidFinishGathering gets called by the notification observer, stops the query and calls LoadDocument, which uses the UIDocument.Open method with a completion handler to attempt to load the file and display it in a MonkeyDocumentViewController.

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-DokumentenDisplaying iCloud Documents

Das Anzeigen eines uidocument sollte keiner anderen Modell Klasse unterscheiden: Eigenschaften werden in UI-Steuerelementen angezeigt, die möglicherweise vom Benutzer bearbeitet und dann zurück in das Modell geschrieben werden.Displaying a UIDocument shouldn't be any different to any other model class - properties are displayed in UI controls, possibly edited by the user and then written back to the model.

Im Beispiel zeigt iclouduidoc\monkeydocumentviewcontroller.cs den monkeydocument-Text in einem an UITextView .In the example iCloudUIDoc\MonkeyDocumentViewController.cs displays the MonkeyDocument text in a UITextView. ViewDidLoadlauscht auf die Benachrichtigung, die in der-Methode gesendet wurde MonkeyDocument.LoadFromContents .ViewDidLoad listens for the notification sent in the MonkeyDocument.LoadFromContents method. LoadFromContentswird aufgerufen, wenn icloud neue Daten für die Datei enthält, sodass diese Benachrichtigung anzeigt, dass das Dokument aktualisiert wurde.LoadFromContents is called when iCloud has new data for the file, so that notification indicates that the document has been updated.

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

Der Beispielcode-Benachrichtigungs Handler Ruft eine-Methode auf, um die Benutzeroberfläche zu aktualisieren (in diesem Fall ohne Konflikterkennung oder-Lösung).The sample code notification handler calls a method to update the UI - in this case without any conflict detection or resolution.

[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-DokumentenSaving iCloud Documents

Wenn Sie icloud ein uidocument hinzufügen möchten, können Sie UIDocument.Save direkt (nur für neue Dokumente) oder eine vorhandene Datei mithilfe von verschieben NSFileManager.DefaultManager.SetUbiquitious .To add a UIDocument to iCloud you can call UIDocument.Save directly (for new documents only) or move an existing file using NSFileManager.DefaultManager.SetUbiquitious. Der Beispielcode erstellt ein neues Dokument direkt im ortsunabhängigen Erreichbarkeit-Container mit diesem Code (es gibt zwei Abschluss Handler, einen für den Save Vorgang und einen für den geöffneten):The example code creates a new document directly in the ubiquity container with this code (there are two completion handlers here, one for the Save operation and another for the 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 wird die Meldung angezeigt, UIDocument dass Sie mit geändert wurde UpdateChangeCount , und es wird automatisch ein Vorgang zum Speichern auf Datenträger geplant:Subsequent changes to the document are not "saved" directly, instead we tell the UIDocument that it has changed with UpdateChangeCount, and it will automatically schedule a save to disk operation:

doc.UpdateChangeCount (UIDocumentChangeKind.Done);

Verwalten von icloud-DokumentenManaging iCloud Documents

Benutzer können icloud-Dokumente im Verzeichnis " Dokumente " des "ubiquity-Containers" außerhalb Ihrer Anwendung über Einstellungen verwalten. Sie können die Datei Liste anzeigen und zum Löschen schwenken.Users can manage iCloud documents in the Documents directory of the "ubiquity container" outside of your application via Settings; they can view the file list and swipe to delete. Anwendungscode sollte in der Lage sein, die Situation zu behandeln, in der Dokumente vom Benutzer gelöscht werden.Application code should be able to handle the situation where documents are deleted by the user. Speichern Sie keine internen Anwendungsdaten im Verzeichnis " Dokumente ".Do not store internal application data in the Documents directory.

Verwalten von icloud-Dokumenten WorkflowManaging iCloud Documents workflow

Benutzer erhalten auch andere Warnungen, wenn Sie versuchen, eine icloud-fähige Anwendung von Ihrem Gerät zu entfernen, um Sie über den Status von icloud-Dokumenten in Bezug auf diese Anwendung zu informieren.Users will also receive different warnings when they attempt to remove an iCloud-enabled application from their device, to inform them of the status of iCloud documents related to that application.

Beispiel Dialogfeld, wenn der Benutzer versucht, eine icloud-fähige Anwendung von seinem Gerät zu entfernenSample dialog when the user attempts to remove an iCloud-enabled application from their device

Beispiel Dialogfeld, wenn der Benutzer versucht, eine icloud-fähige Anwendung von seinem Gerät zu entfernenSample dialog when the user attempts to remove an iCloud-enabled application from their device

icloud-SicherungiCloud Backup

Das Sichern in icloud ist kein Feature, auf das von Entwicklern direkt zugegriffen wird. die Art und Weise, wie Sie Ihre Anwendung entwerfen, kann sich auf die Benutzer Funktionalität auswirken.While backing up to iCloud isn't a feature that is directly accessed by developers, the way you design your application can affect the user experience. Apple bietet IOS-Daten Speicherungs Richtlinien für Entwickler, die in ihren IOS-Anwendungen befolgt werden sollen.Apple provides iOS Data Storage Guidelines for developers to follow in their iOS applications.

Der wichtigste Aspekt ist, ob in Ihrer APP große Dateien gespeichert werden, die nicht vom Benutzer generiert werden (z. b. eine Magazine Reader-Anwendung, die hundert Plus Megabyte an Inhalten pro Problem speichert).The most important consideration is whether your app stores large files that are not user-generated (for example, a magazine reader application that stores hundred-plus megabytes of content per issue). Apple bevorzugt, dass Sie diese Art von Daten nicht speichern, wenn Sie in der icloud gesichert werden, und das icloud-Kontingent des Benutzers unnötig auffüllen.Apple prefers that you do not store this sort of data where it will be backed-up to iCloud and unnecessarily fill the user's iCloud quota.

Anwendungen, die große Datenmengen wie diese speichern, sollten Sie entweder in einem der nicht gesicherten Benutzerverzeichnisse speichern (z. b.Applications that store large amounts of data like this should either store it in one of the user directories that is not backed-up (eg. Caches oder tmp) oder verwenden Sie NSFileManager.SetSkipBackupAttribute , um ein Flag auf diese Dateien anzuwenden, damit icloud diese während Sicherungs Vorgängen ignoriert.Caches or tmp) or use NSFileManager.SetSkipBackupAttribute to apply a flag to those files so that iCloud ignores them during backup operations.

ZusammenfassungSummary

In diesem Artikel wurde das neue icloud-Feature eingeführt, das in ios 5 enthalten ist.This article introduced the new iCloud feature included in iOS 5. Es wurden die Schritte erläutert, die erforderlich sind, um Ihr Projekt für die Verwendung von icloud zu konfigurieren und dann Beispiele für die Implementierung von icloud-Funktionen bereitzustellenIt examined the steps required to configure your project to use iCloud and then provided examples of how to implement iCloud features.

Mit dem Beispiel für den Schlüssel-Wert-Speicher wurde veranschaulicht, wie icloud verwendet werden kann, um eine kleine Menge von Daten zu speichern, die der Art der Speicherung von nsuserpreferences ähneln.The key-value storage example demonstrated how iCloud can be used to store a small amount of data similar to the way NSUserPreferences are stored. Im uidocument-Beispiel wurde gezeigt, wie komplexere Daten auf mehreren Geräten über icloud gespeichert und synchronisiert werden können.The UIDocument example showed how more complex data can be stored and synchronized across multiple devices via iCloud.

Schließlich wurde eine kurze Erläuterung dazu hinzugefügt, wie sich das Hinzufügen der icloud-Sicherung auf den Anwendungs Entwurf auswirken sollte.Finally it included a brief discussion on how the addition of iCloud Backup should influence your application design.