Die Synchronisierung von Anwendungsdaten auf Geräten ist eine komplexe und schwierige Aufgabe. Zum Glück hat Apple genau deshalb iCloud gebaut. In dieser Tuts + Premium-Serie erfahren Sie, wie iCloud funktioniert und wie Ihre Anwendungen Daten nahtlos auf mehreren Geräten gemeinsam nutzen können.
In der ersten Folge dieser Serie habe ich eine Einführung in iCloud gegeben und mich insbesondere auf iCloud Storage konzentriert. Zwei Arten von iCloud Storage stehen Entwicklern zur Verfügung, Schlüsselwertspeicherung und Dokumentenspeicher. Schlüsselwertspeicherung steht im Mittelpunkt dieses Tutorials.
Wir beginnen dieses Tutorial mit einem genaueren Blick auf die Einrichtung einer Anwendung zur Verwendung mit iCloud. Wenn unsere Anwendung ordnungsgemäß konfiguriert ist, verwenden wir den Key-Value-Speicher von iCloud, um die Daten unserer Anwendung auf mehreren Geräten synchron zu halten.
Wir können die Datensynchronisation nicht mit nur einem Gerät testen. Um dieses Lernprogramm abzuschließen, benötigen Sie mindestens zwei iOS-Geräte, auf denen iOS 5 oder höher ausgeführt wird. Leider kann der iOS-Simulator nicht zum Testen von iCloud Storage verwendet werden.
Die Anwendung, die wir gerade erstellen werden, wird eine einfache iOS-Anwendung sein, was bedeutet, dass Sie sie auf jedem iPhone, iPod Touch oder iPad mit iOS 5 oder höher ausführen können. Das Lesen dieses Tutorials lohnt sich auch dann, wenn Sie nicht zwei separate iOS-Geräte zum Testen verwenden. Es wird Ihnen zeigen, wie iCloud eingerichtet wird und wie Sie den Key-Value-Speicher von iCloud verwenden können, um Ihre eigenen Anwendungen zu verbessern.
Ich werde Sie zunächst durch den Prozess der Konfiguration unserer Anwendung für die Verwendung von iCloud Storage führen. Zunächst müssen wir jedoch unser Xcode-Projekt einrichten.
Erstellen Sie ein neues Projekt in Xcode, indem Sie das auswählen Einzelansicht-Anwendung Vorlage. Benennen Sie Ihre Bewerbung Wolkig, Geben Sie ein Firmenbezeichnung, einstellen iPhone für die Gerätefamilie und überprüfen Sie Verwenden Sie die automatische Referenzzählung. Die übrigen Kontrollkästchen sollten deaktiviert sein. Sagen Sie Xcode, wo Sie Ihr Projekt speichern möchten, und klicken Sie auf Erstellen.
Es ist wichtig, dass Sie das sorgfältig auswählen Produktname und Firmenbezeichnung für dieses Projekt. Die Kombination dieser beiden Elemente bildet die Bündelkennung (zusammen mit der Bundle-Seed-ID) Ihrer Anwendung, die von iCloud verwendet wird, um Ihre Anwendung eindeutig zu identifizieren. Überprüfen Sie Ihre Rechtschreibung sorgfältig, da bei der Paketkennung die Groß- und Kleinschreibung beachtet wird.
Wie ich im ersten Artikel dieser Tuts + Premium-Serie erwähnt habe, ist das Einrichten einer Anwendung für die Verwendung von iCloud einfach und umfasst nur zwei Schritte. Lassen Sie sich Schritt für Schritt durch den Prozess führen.
Öffnen Sie Ihren bevorzugten Browser und gehen Sie zum iOS Dev Center von Apple. Melden Sie sich bei Ihrem iOS-Entwicklerkonto an und klicken Sie auf iOS-Bereitstellungsportal Link auf der rechten Seite.
Zuerst müssen wir ein erstellen App-ID für unsere anwendung. Öffne das App-IDs Registerkarte links und klicken Sie auf die Schaltfläche Neue App-ID Knopf oben rechts. Geben Sie Ihrer App-ID einen beschreibenden Namen, um sie später leicht identifizieren zu können. Geben Sie als Nächstes die Bundle-ID ein, über die ich vor einiger Zeit gesprochen habe. Die Bundle-Kennung ist die Kombination Ihrer Firmenkennung, com.mobiletuts in unserem Beispiel und dem Produktnamen, Wolkig in unserem Beispiel. Sie können die Bundle-Seed-Kennung auf gesetzt lassen Verwenden Sie die Team ID, Das ist gut für unsere Anwendung.
Prüfen Sie noch einmal, ob Ihre Bundle-ID richtig geschrieben ist. Wie ich bereits erwähnt habe, ist bei der Bunder-Kennzeichnung die Groß- und Kleinschreibung zu beachten. Klicken Sie auf die Schaltfläche "Senden", um Ihre App-ID zu erstellen.
Ihre neu erstellte App-ID sollte jetzt in der Liste der App-IDs vorhanden sein. Sie werden feststellen, dass iCloud für jede neu erstellte App-ID standardmäßig deaktiviert ist. Lass uns das ändern. Klicken Sie rechts von Ihrer App-ID auf Konfigurieren Taste. Am unteren Rand der Seite sollte ein Kontrollkästchen mit der Aufschrift angezeigt werden Aktivieren Sie für iCloud. Aktivieren Sie das Kontrollkästchen und klicken Sie auf Erledigt. Unsere App-ID ist jetzt für die Zusammenarbeit mit iCloud konfiguriert. Es gibt noch eine Sache, auf die wir achten müssen, während wir in der Bereitstellungsportal.
Um sicherzustellen, dass unsere Anwendung auf unseren Geräten ausgeführt werden kann, müssen wir ein Bereitstellungsprofil erstellen. Öffnen Sie noch im iOS-Bereitstellungsportal die Bereitstellung Registerkarte links und wählen Sie die Entwicklung Tab oben. Drücke den Neues Profil oben rechts und geben Sie einen beschreibenden Namen für Ihr neues Profil ein. Wählen Sie als Nächstes das Entwicklungszertifikat aus, mit dem das Profil verknüpft werden soll, und wählen Sie aus der Dropdown-Liste die richtige App-ID aus. Wählen Sie schließlich die Geräte aus, die Sie zum Testen verwenden möchten, aus der Liste ganz unten auf der Seite.
Nachdem Sie unten rechts auf die Schaltfläche "Senden" geklickt haben, werden Sie feststellen, dass Ihr Provisioning-Profil den Status "" hat steht aus. Nach dem erneuten Laden der Seite sollte der Status des Profils auf aktualisiert worden sein Aktiv. Klicken Sie auf die Download-Schaltfläche neben Ihrem Bereitstellungsprofil und doppelklicken Sie auf das Profil. Xcode installiert das Profil automatisch für Sie.
Viele Entwickler schrecken zurück, wenn sie das Wort hören Ansprüche. Berechtigungen sind nichts, vor dem man Angst haben muss, wenn man erst einmal verstanden hat, wozu sie dienen. Berechtigungen gewähren einer Anwendung bestimmte Funktionen oder Sicherheitsberechtigungen. Das ist alles was dazu gehört. Es ist eine einfache Liste von Schlüssel-Wert-Paaren, die dem Betriebssystem mitteilt, was Ihre Anwendung kann und was nicht und welche Anwendungen Zugriff auf die Daten Ihrer Anwendung haben. Letzteres ist besonders wichtig, wenn Sie mit iCloud arbeiten.
In unserem Beispiel können wir mit iCloud-Berechtigungen iCloud Storage für unsere Anwendung aktivieren. Um die Berechtigungen unserer Anwendung zu konfigurieren, gehen wir zum Zieleditor von Xcode.
Klicken Sie auf unser Projekt in der Projektnavigator und wählen Sie unser Ziel aus der Liste der Ziele. Mit dem Zusammenfassung Wenn Sie die Registerkarte auswählen, sollte ein Abschnitt mit dem Namen angezeigt werden Ansprüche unten. Aktivieren Sie das erste Kontrollkästchen, um Berechtigungen für unsere Anwendung zu aktivieren. Diese Option erstellt eine Berechtigungsdatei für unsere Anwendung. Das Textfeld unter dem Kontrollkästchen sollte für Sie ausgefüllt sein. Jetzt haben wir die Option, die iCloud-Schlüsselwertspeicherung und die iCloud-Dokumentenspeicherung zu aktivieren.
In diesem Lernprogramm werde ich nur über iCloud Key-Value Storage sprechen. Aktivieren Sie das Kontrollkästchen neben iCloud Key-Value Store. Wiederum füllt Xcode das Textfeld neben dem Kontrollkästchen mit Ihrer Anwendungspaket-ID (ohne die Paket-Startnummer) vor. Stellen Sie sicher, dass diese Bundle-ID derjenigen entspricht, die Sie beim Erstellen Ihrer App-ID im Bereitstellungsportal eingegeben haben. Ich werde im nächsten Tutorial über iCloud-Container sprechen, wenn sie sich auf iCloud Document Storage beziehen.
Am unteren Rand des Berechtigungsabschnitts sehen Sie Schlüsselgruppen-Zugriffsgruppen. Diese Liste gibt an, welche Anwendungen Zugriff auf die Schlüsselbundelemente Ihrer Anwendung haben. Sie können diesen Abschnitt vorerst unberührt lassen.
Bevor wir uns mit den iCloud-APIs schmutzig machen, müssen wir unsere Build-Einstellungen konfigurieren. Wählen Sie weiterhin im Ziel-Editor von Xcode die Option Einstellungen erstellen Registerkarte und blättern Sie nach unten zu Code signieren Sektion. Legen Sie die Codesignaturidentität für das fest Debuggen und Veröffentlichung Konfigurationen entsprechend dem Profil, das wir gerade erstellt haben iOS-Bereitstellungsportal.
Dieses Tutorial ist etwas fortgeschritten und ich gehe daher davon aus, dass Sie mit den grundlegenden Konzepten der iOS-Entwicklung vertraut sind. Das bedeutet, dass ich mich etwas schneller bewegen werde als sonst, da wir viel zu tun haben.
Die Anwendung, die wir gerade erstellen, wird ein einfacher Lesezeichenmanager sein. Wir können Lesezeichen hinzufügen und löschen, und unsere Lesezeichen werden auf unseren Geräten synchronisiert. Wie cool ist das? Lass uns anfangen.
Öffnen Sie die Header-Datei unseres View-Controllers und erstellen Sie eine Instanzvariable (ivar) des Typs NSMutableArray
mit einem Namen von Lesezeichen. Der ivar speichert unsere Lesezeichen. Die Lesezeichen werden in einer Tabellenansicht angezeigt. Erstellen Sie einen Auslass für die Tabellensicht in der Header-Datei unseres View-Controllers, und stellen Sie sicher, dass Sie unseren View-Controller an die Tabellensicht-Datenquelle anpassen und Protokolle delegieren. Vergessen Sie auch nicht, Accessoren für beide Eigenschaften in der Implementierungsdatei unseres View-Controllers zu synthetisieren. Als nächstes fügen Sie zwei Aktionen hinzu ViewController.h, editBookmarks: und Lesezeichen hinzufügen:. Bereit? Geh rüber zum ViewController.xib Datei, um alles zu verdrahten.
#einführen@Interface ViewController: UIViewController NSMutableArray * _bookmarks; __weak UITableView * _tableView; @ property (nichtatomisch, stark) NSMutableArray * -Lesezeichen; @ property (nichtatomisch, schwach) IBOutlet UITableView * tableView; - (IBAction) editBookmarks: (ID) Absender; - (IBAction) addBookmark: (id) Absender; @Ende
Ziehen Sie zunächst eine Navigationsleiste in die Ansicht unseres View-Controllers und positionieren Sie sie ganz oben. Ziehen Sie eine Instanz von UIBarButtonItem
links von der Navigationsleiste und setzen Sie ihre Kennung im Attribute-Inspektor zu Bearbeiten. Ziehen Sie den Mauszeiger von der Bearbeitungsschaltfläche auf unsere Eigentümer der Datei und wähle das aus editBookmarks: Methode. Ziehen Sie ein zweites Bar-Schaltflächenelement rechts neben der Navigationsleiste und geben Sie ihm einen Bezeichner von Hinzufügen. Ziehen Sie die Drag-Taste vom Add-Button auf unser Eigentümer der Datei und wähle das aus Lesezeichen hinzufügen: Methode. Ziehen Sie abschließend eine Instanz von UITableView
unserer View-Controller-Ansicht, verbinden Sie die Datenquelle und delegieren Sie die Ausgänge an die Eigentümer der Datei Objekt. Erledigt.
Die Implementierung der Datenquellen- und Delegatenprotokolle unserer Tabellensicht ist einfach und unkompliziert. In dem numberOfSectionsInTableView: Als Methode überprüfen wir, ob unsere Datenquelle, dh unsere Lesezeichen, nicht gleich Null ist. Wenn es null ist, geben wir 1 zurück. Wenn nicht, geben wir 0 zurück tableView: numberOfRowsInSection: Methode ist fast identisch. Wenn unsere Datenquelle nicht gleich Null ist, geben wir stattdessen die Anzahl der darin enthaltenen Elemente zurück. Wenn unsere Datenquelle gleich Null ist, geben wir 0 zurück.
- (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView if (self.bookmarks) return 1; else return 0; - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) Abschnitt if (! Self.bookmarks) return 0; else return self.bookmarks.count;
In dem tableView: cellForRowAtIndexPath: Als erstes deklarieren wir einen statischen Zellbezeichner für die Wiederverwendung von Zellen und fragen dann die Tabellensicht nach einer wiederverwendbaren Zelle mit dem gerade deklarierten Zellbezeichner. Wenn keine wiederverwendbare Zelle zurückgegeben wurde, initialisieren wir eine neue Zelle mit dem Stil von UITableViewCellStyleSubtitle
und wir übergeben unsere Zellkennung zur Wiederverwendung von Zellen. Als nächstes holen wir das richtige Lesezeichen aus der Datenquelle. Jedes Lesezeichen ist ein Wörterbuch mit zwei Schlüssel-Wert-Paaren, a Name und ein URL. Wir konfigurieren die Zelle, indem wir die Beschriftung und die Detailbeschriftung mit dem Namen und der URL des Lesezeichens setzen.
- (UITableViewCell *) tableView: (UITableView *) aTableView cellForRowAtIndexPath: (NSIndexPath *) indexPath statischer NSString * CellIdentifier = @ "Cell Identifier"; UITableViewCell * cell = [aTableView dequeueReusableCellWithIdentifier: CellIdentifier]; if (cell == nil) cell = [[UITableViewCell-Zuweisung] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: CellIdentifier]; // Fetch Bookmark NSDictionary * bookmark = [self.bookmarks objectAtIndex: indexPath.row]; // Zelle konfigurieren cell.textLabel.text = [bookmark objectForKey: @ "name"]; cell.detailTextLabel.text = [bookmark objectForKey: @ "url"]; zurück Zelle;
Der Benutzer hat auch die Möglichkeit, seine Lesezeichen zu bearbeiten. In dem tableView: canEditRowAtIndexPath: Methode kehren wir zurück JA. Das tableView: commitEditingStyle: forRowAtIndexPath: ist etwas komplexer. Wir beginnen mit der Überprüfung, dass der Bearbeitungsstil der Zelle dem entspricht UITableViewCellEditingStyleDelete
, Das heißt, ein Lesezeichen wurde gelöscht. Zuerst aktualisieren wir unsere Datenquelle, indem wir das Lesezeichen aus dem Lesezeichen-Array löschen. Dann speichern wir die Datenquelle, indem wir unseren View Controller senden saveBookmarks Nachricht und wir aktualisieren die Tabellenansicht schließlich, um die Änderungen an der Datenquelle widerzuspiegeln.
- (BOOL) tableView: (UITableView *) tableView canEditRowAtIndexPath: (NSIndexPath *) indexPath return YES; - (void) tableView: (UITableView *) aTableView commitEditingStyle: (UITableViewCellEditingStyle) bearbeitungsstil fürRowAtIndexPath: (NSIndexPath *) indexPath if (editStyle = = UITableViewCellEditingStyleDelete) // Lesezeichen speichern [self saveBookmarks]; // Tabellenansicht aktualisieren [aTableView deleteRowsAtIndexPaths: [NSArray arrayWithObject: indexPath] withRowAnimation: UITableViewRowAnimationFade];
Schauen wir uns jetzt unsere Aktionen an. Das editBookmarks: Methode könnte nicht einfacher sein. Wir ändern den Bearbeitungsstatus der Tabellenansicht auf animierte Weise.
- (IBAction) editBookmarks: (id) sender [self.tableView setEditing:! Self.tableView.editing animated: YES];
Das Lesezeichen hinzufügen: Methode erfordert etwas mehr Arbeit. Wir initialisieren eine neue Instanz von AddBookmarkViewController
, einen Ansichts-Controller, den wir in Kürze erstellen werden, und setzen dessen Ansichts-Controller-Eigenschaft auf selbst
. Den neu erstellten View-Controller präsentieren wir dann modal. Wie der Name schon sagt, AddBookmarkViewController
ist für die Erstellung neuer Lesezeichen verantwortlich. Schauen wir uns das genauer an AddBookmarkViewController
.
- (IBAction) addBookmark: (id) sender // Initialisieren Lesezeichen hinzufügen Controller hinzufügen AddBookmarkViewController * vc = [[AddBookmarkViewController-Zuordnung] initWithNibName: @ "AddBookmarkViewController" Bundle: [NSBundle mainBundle]]; vc.viewController = selbst; // View-Controller modal präsentieren [self presentViewController: vc animiert: YES Completion: nil];
Die Implementierung von AddBookmarkViewController
ist sehr unkompliziert, deshalb werde ich nicht zu sehr ins Detail gehen. Der View Controller hat eine schwache Referenz zu unserem Main View Controller. Dadurch kann unser Hauptansicht-Controller benachrichtigt werden, wenn ein neues Lesezeichen erstellt wurde. Es hat auch zwei Auslässe vom Typ UITextField
, Dadurch kann der Benutzer für jedes Lesezeichen einen Namen und eine URL eingeben.
#einführen@class ViewController; @interface AddBookmarkViewController: UIViewController __weak ViewController * _viewController; __weak UITextField * _nameField; __weak UITextField * _urlField; @ property (nicht atomar, schwach) ViewController * viewController; @ property (nichtatomisch, schwach) IBOutlet UITextField * nameField; @ property (nichtatomisch, schwach) IBOutlet UITextField * urlField; @Ende
Die XIB-Datei enthält oben eine Navigationsleiste mit einem stornieren und ein sparen Taste. Die Ansicht selbst enthält die Namen und URL-Textfelder, die ich gerade erwähnt habe. Die Schaltflächen Abbrechen und Speichern sind mit a verbunden stornieren: und ein sparen: Aktion. Das stornieren: Aktion lehnt einfach unseren Modal View Controller ab. Das sparen: Aktion ist genauso einfach. Wir erstellen ein neues Lesezeichen (d. H. Eine Instanz von NSDictionary
) mit den Daten, die der Benutzer in die Textfelder eingegeben hat, und teilen Sie unserem Hauptansicht-Controller das neue Lesezeichen mit. Es ist wichtig zu wissen, dass dies nicht die beste Lösung ist, um unseren Hauptansicht-Controller mitzuteilen, wenn ein neues Lesezeichen von unserem erstellt wurde AddBookmarkViewController
. Dieser Ansatz führt eine feste Kopplung ein, die so weit wie möglich vermieden werden sollte. Ein besserer Ansatz wäre die Übernahme des Delegationsmusters.
- (IBAction) cancel: (id) sender [self dismissViewControllerAnimated: YES Vervollständigung: nil]; - (IBAction) save: (id) sender NSString * name = self.nameField.text; NSString * url = self.urlField.text; NSDictionary * bookmark = [[NSDictionary-Zuordnung] initWithObjectsAndKeys: name, @ "name", url, @ "url", nil]; [self.viewController saveBookmark: Lesezeichen]; [self dismissViewControllerAnimated: YES Completion: nil];
Wir sind fast fertig, müssen dies aber noch umsetzen saveBookmark: Methode in unserer Hauptansicht Controller. Beginnen Sie mit der Deklaration dieser Methode in der Header-Datei unseres View-Controllers und gehen Sie dann zu der Implementierungsdatei. Die Implementierung ist minimal. Wir fügen das neu erstellte Lesezeichen zu unserer Datenquelle hinzu, speichern die Datenquelle und laden dann die Tabellenansicht neu, um das gerade hinzugefügte Lesezeichen anzuzeigen.
- (void) saveBookmark: (NSDictionary *) Lesezeichen // Lesezeichen zu Lesezeichen hinzufügen [self.bookmarks addObject: bookmark]; // Lesezeichen speichern [self saveBookmarks]; // Reload Table View [self.tableView reloadData];
Unsere Anwendung ist nicht sehr nützlich, wenn die Lesezeichen des Benutzers nicht auf der Festplatte gespeichert werden. Der Benutzer würde seine Lesezeichen bei jedem Beenden der Anwendung verlieren. Schlechte Benutzererfahrung Lass uns das beheben.
In unserer viewDidLoad: Methode senden wir unseren View Controller a loadBookmarks Botschaft. Werfen wir einen Blick auf die loadBookmarks Methode. Wir speichern die Lesezeichen des Benutzers im Benutzervorgabendatenbank. Zuerst prüfen wir mit dem Schlüssel, ob bereits ein Eintrag in der Datenbank der Benutzervorgaben vorhanden ist Lesezeichen
. Wenn dies der Fall ist, initialisieren wir unsere Lesezeichen mit dem Inhalt des gespeicherten Objekts. Ist dies nicht der Fall, initialisieren wir unsere Lesezeichen mit einem leeren veränderbaren Array und speichern dieses Array in der Datenbank der Benutzervorgaben. Einfach. Recht?
- (void) viewDidLoad [super viewDidLoad]; // Lesezeichen laden [self loadBookmarks];
- (void) loadBookmarks NSUserDefaults * ud = [NSUserDefaults standardUserDefaults]; if ([ud objectForKey: @ "bookmarks"]! = nil) // Lokale Kopie laden self.bookmarks = [NSMutableArray arrayWithArray: [ud objectForKey: @ "bookmarks"]]; else // Bookmarks initialisieren self.bookmarks = [[NSMutableArray-Zuordnung] init]; // Lokale Kopie speichern [ud setObject: self.bookmarks forKey: @ "bookmarks"];
Das Speichern der Lesezeichen ist noch einfacher. Wir speichern unser Lesezeichenobjekt in der Datenbank der Benutzervorgaben mit dem Schlüssel Lesezeichen
. Das ist alles dazu.
- (void) saveBookmarks NSUserDefaults * ud = [NSUserDefaults standardUserDefaults]; [ud setObject: self.bookmarks forKey: @ "Lesezeichen"];
Das war ziemlich viel Arbeit. Sie können jetzt Ihre Anwendung erstellen und ausführen. Sie sollten in der Lage sein, Lesezeichen hinzuzufügen und Lesezeichen zu löschen. Die Lesezeichen werden auf der Festplatte gespeichert, so dass beim Beenden der Anwendung keine Daten verloren gehen.
Um unsere Anwendung wirklich zum Strahlen zu bringen, verwenden wir iCloud, um die Lesezeichen auf unseren Geräten synchron zu halten. Es wird Sie überraschen, wie einfach das ist. Wie ich bereits im vorigen Tutorial dieser Serie erwähnt habe, funktioniert der Key-Value-Speicher von iCloud sehr ähnlich NSUserDefaults
, das heißt, es speichert Schlüssel-Wert-Paare. In der iCloud-Terminologie wird der Store benannt NSUbiquitousKeyValueStore
. Beginnen wir damit, unsere Lesezeichen nicht nur lokal, sondern auch in iCloud zu speichern.
Gehen Sie zu unserem saveBookmarks: Methode und ändern Sie unsere Methode, um wie folgt auszusehen. Wir beginnen mit dem Abrufen eines Verweises auf den Standardspeicher defaultStore auf der NSUbiquitousKeyValueStore
Klasse. Wieder ist dies sehr ähnlich NSUserDefaults
. Wenn unser Verweis auf den Store nicht gleich Null ist, speichern wir unser Lesezeichenobjekt im Store mit demselben Schlüssel, den wir zum Speichern unserer Lesezeichen in der Datenbank der Benutzervorgaben verwendet haben. Zum Schluss synchronisieren wir den Laden.
- (void) saveBookmarks // Lokale Kopie speichern NSUserDefaults * ud = [NSUserDefaults standardUserDefaults]; [ud setObject: self.bookmarks forKey: @ "Lesezeichen"]; // Save To iCloud NSUbiquitousKeyValueStore * store = [NSUbiquitousKeyValueStore defaultStore]; if (store! = nil) [setObject speichern: self.bookmarks forKey: @ "Lesezeichen"]; [Speicher synchronisieren];
Berufung synchronisieren In der Speicherinstanz werden die im Speicher befindlichen Schlüssel und Werte mit den auf der Festplatte gespeicherten Werten synchronisiert. Sie denken vielleicht, dass diese Methode zwingt, neue Schlüssel-Wert-Paare an iCloud zu senden, dies ist jedoch nicht der Fall. Durch das Speichern der In-Memory-Schlüssel auf der Festplatte wird iCloud benachrichtigt, dass neue Schlüssel-Wert-Paare zum Synchronisieren verfügbar sind. Letztendlich entscheidet jedoch das Betriebssystem, wann es angebracht ist, die neu hinzugefügten Schlüssel-Wert-Paare mit iCloud zu synchronisieren. Dies ist wichtig zu beachten. Dies ist auch der Grund, warum Änderungen, die an einem Gerät vorgenommen wurden, nicht sofort auf einem anderen Gerät sichtbar sind.
Auch wenn wir angerufen haben synchronisiert Diese Methode ist in den meisten Situationen nicht erforderlich. Das Betriebssystem erledigt dies für Sie zu geeigneten Zeitpunkten. Wussten Sie das? NSUserDefaults
hat ein synchronisieren auch Methode, die fast identisch funktioniert?
Sie fragen sich vielleicht, wie unsere Anwendung weiß, wann ein anderes Gerät den Schlüsselwertspeicher in iCloud aktualisiert hat und wie diese Änderungen übernommen werden können. Dies ist eine sehr gute Frage und dies ist das letzte Puzzleteil.
Jedes Mal, wenn der Schlüsselwertspeicher geändert wurde, wird eine Benachrichtigung gesendet, und unsere Anwendung kann sich als Obeserver für diese Benachrichtigungen registrieren. Es ist wichtig, dass Sie sich so früh wie möglich im Lebenszyklus Ihrer Anwendung für solche Benachrichtigungen registrieren.
Mal sehen, wie das funktioniert. In unserer viewDidLoad Methode machen wir vier Dinge. Zuerst erhalten wir einen Verweis auf den Schlüsselwertspeicher. Zweitens fügen wir unseren View Controller als Beobachter für alle Benachrichtigungen mit dem Namen NSUbiquitousKeyValueStoreDidChangeExternallyNotification
wird vom Key-Value Store gesendet. Wenn wir eine solche Benachrichtigung erhalten, werden wir diese Benachrichtigung in unserem Portal bearbeiten updateKeyValuePairs: Methode (die wir gleich schreiben werden). Als nächstes senden wir dem Laden eine Nachricht von synchronisieren. Schließlich laden wir unsere Lesezeichen wie zuvor.
- (void) viewDidLoad [super viewDidLoad]; NSUbiquitousKeyValueStore * store = [NSUbiquitousKeyValueStore defaultStore]; [[NSNotificationCenter defaultCenter] addObserver: Selbstselektor: @selector (updateKeyValuePairs :) Name: NSUbiquitousKeyValueStoreDidChangeExternallyNotification-Objekt: store]; // Synchronize Store [Store Synchronize]; // Lesezeichen laden [self loadBookmarks];
Wir müssen nur noch das implementieren updateKeyValuePairs: Methode. Lass uns das jetzt machen. Die Benachrichtigung ist Benutzerinformation
Das Wörterbuch enthält zwei wichtige Schlüssel-Wert-Paare (1) Grund warum die Benachrichtigung gesendet wurde und (2) die Schlüssel im Schlüsselwertspeicher deren Werte geändert wurden. Zunächst betrachten wir den Grund der Benachrichtigung. Wir stellen zunächst sicher, dass ein Grund angegeben wurde, und kehren zurück, wenn keiner angegeben wurde. Wenn tatsächlich ein Grund angegeben wurde, fahren wir nur fort, wenn der Grund entweder eine Änderung auf dem Server war (NSUbiquitousKeyValueStoreServerChange
) oder lokale Änderungen wurden aufgrund einer anfänglichen Synchronisierung mit dem Server verworfen (NSUbiquitousKeyValueStoreInitialSyncChange
). Wenn eines dieser Kriterien erfüllt ist, ziehen wir das geänderte Tastenfeld heraus und überlaufen die Schlüssel, um zu sehen, ob sich unser Lesezeichen-Schlüssel darunter befindet. Wenn dies der Fall ist, nehmen wir den mit dem Schlüssel verknüpften Wert und aktualisieren unsere Datenquelle sowie die Datenbank der Benutzervorgaben mit diesem Wert. Zum Schluss laden wir die Tabellenansicht neu, um die Änderungen widerzuspiegeln.
- (void) updateKeyValuePairs: (NSNotification *) Benachrichtigung NSDictionary * userInfo = [Benachrichtigung userInfo]; NSNumber * changeReason = [userInfo objectForKey: NSUbiquitousKeyValueStoreChangeReasonKey]; NSInteger-Grund = -1; // Ist ein Grund angegeben? if (! changeReason) return; else reason = [changeReason integerValue]; // Fortfahren, wenn der Grund (1) auf dem Server geändert wurde oder (2) Anfangssynchronisation, wenn ((Grund NSUbiquitousKeyValueStoreServerChange) || (Grund = NSUbiquitousKeyValueStoreInitialSyncChange)) NSArray * changesKanal = [BenutzerInfo objectForKey:]. NSUbiquitousKeyValueStore * store = [NSUbiquitousKeyValueStore defaultStore]; // Suchschlüssel für "bookmarks" Schlüssel für (NSString * key in changedKeys) if ([key isEqualToString: @ "bookmarks"]) // Datenquelle aktualisieren self.bookmarks = [NSMutableArray arrayWithArray: [store objectForKey: key] ]; // Lokale Kopie speichern NSUserDefaults * ud = [NSUserDefaults standardUserDefaults]; [ud setObject: self.bookmarks forKey: @ "Lesezeichen"]; // Reload Table View [self.tableView reloadData];
Es gibt zwei Punkte, die besondere Aufmerksamkeit erfordern. Erstens, wie wir bei der Implementierung von gesehen haben updateKeyValuePairs:, Wir erhalten ein Array mit allen Schlüsseln im Schlüsselwertspeicher, deren Werte geändert wurden. Dies ist eine Optimierung, um zu verhindern, dass iCloud für jedes geänderte Schlüsselwertpaar eine Benachrichtigung senden muss. Zweitens wird dringend empfohlen, alle Daten aus dem Schlüsselwertspeicher lokal zu speichern. Die Datenbank für Benutzervorgaben ist für diesen Zweck gut geeignet, Sie können jedoch die Lösung wählen, die Ihren Anforderungen entspricht. Der Grund für das Speichern einer lokalen Kopie besteht darin, dass Sie sich bei der Datenspeicherung nicht auf iCloud verlassen. Nicht jeder Benutzer verfügt über ein iCloud-Konto oder die Aktivierung von iCloud auf seinem Gerät.
Mit diesem abschließenden Code ist unsere Anwendung jetzt iCloud-fähig. Erstellen und starten Sie Ihre Anwendung auf zwei Geräten und testen Sie sie selbst. Beachten Sie, dass Änderungen nicht sofort erfolgen. Änderungen müssen mit den iCloud-Servern synchronisiert und anschließend an die entsprechenden Geräte gesendet werden, die aktualisiert werden müssen.
Auch wenn diese Übung langwierig ist, erfordert die Implementierung von iCloud Key-Value Storage nicht so viel zusätzlichen Code. Wie ich bereits im vorigen Tutorial beschrieben habe, ist die Übernahme von Key-Value Storage einfach und unkompliziert und erfordert nur einen geringen Aufwand.
Bevor Sie dieses Tutorial abschließen, möchte ich die Vor- und Nachteile von iCloud Key-Value Storage noch einmal hervorheben, da sie unbedingt zu beachten sind. Die Profis sind mittlerweile offensichtlich, es ist leicht anzunehmen, schnell zu implementieren und es ähnelt sehr wie NSUserDefaults
funktioniert. Es ist jedoch auch wichtig, die Nachteile im Auge zu behalten. Schlüssel-Wert-Paare sind, was sie sind. Das heißt, einfache Paare ohne jegliche Konfliktbehandlung, sofern Sie nicht Ihre eigene Konfliktbehandlungslogik implementieren. Letzteres wird nicht empfohlen, da Key-Value Storage nicht in diesem Sinne erstellt wurde. Document Storage bietet integrierte Konfliktunterstützung und ist daher eine wesentlich be