Entmystifizierung der iOS 9-Spotlight-Suche für Entwickler
Veröffentlicht: 2022-03-11In iOS sind drei Suchpunkte integriert: Siri, Spotlight-Suche und Safari-Suche. Siri, eine der bekanntesten Funktionen von iOS, ist etwas, mit dem die meisten iPhone-Benutzer bereits vertraut sind. Aber viele Leute sind sich der Spotlight-Suche nicht bewusst – etwas, das ein wesentlicher Bestandteil von iOS war, lange bevor Siri existierte. Auf die Spotlight-Suche kann zugegriffen werden, wenn Sie den Startbildschirm nach unten schieben oder wenn Sie neu bei iOS 9 sind, wischen Sie von Ihrem persönlichen Startbildschirm nach rechts. Dies zeigt eine Suchleiste am oberen Rand des Bildschirms.
Der Schwerpunkt dieses Suchwerkzeugs in iOS 8 und früher lag auf der Suche nach dem Telefon selbst, daher listet die Ergebnisseite Apps auf, die sich auf Ihrem Telefon befinden, sowie E-Mails, Nachrichten und andere private Elemente in den Apple-Apps. Es wird auch eine Wikipedia-Definition angezeigt, wenn sie relevant erscheint. Schließlich bietet es als zusätzlichen Schritt die Möglichkeit, das Internet über Safari zu durchsuchen.
Im Gegensatz zur Spotlight-Suche dreht sich bei Safari alles um die Welt außerhalb Ihres Telefons. In iOS 8 kann der Benutzer auswählen, welche Suchmaschine für die Safari-Suche verwendet werden soll: Google, Yahoo, Bing und DuckDuckGo. Natürlich verarbeitet Google den Großteil der Safari-Suchanfragen. Unabhängig von der gewählten Suchmaschine werden in Safari vorausgefüllte Suchbegriffe angezeigt, möglicherweise mit einem Wikipedia-Match.
In iOS 9 ist die Spotlight-Suche viel prominenter und umfassender als zuvor. Das erste, was Sie sehen, sind „Siri-Vorschläge“, die auf Ihren Nutzungsmustern basieren. Wenn Sie beispielsweise Safari regelmäßig nachmittags verwenden, schlägt Siri es Ihnen um diese Zeit vor.
Und während es immer noch ein Ort ist, an dem Sie „Dinge auf Ihrem Telefon“ finden können, wird es zu einem direkten Portal für „Dinge, die nicht auf Ihrem Telefon sind“. Sie sehen bereits Dinge in der Nähe und Nachrichtenschlagzeilen, die über Apples eigene Suchmaschine aus dem Internet bezogen werden, und andere webbasierte Ergebnisse fangen gerade erst an, jetzt zu erscheinen.
Ja, Apple hat eine Websuchmaschine für iOS 9 erstellt, was ein sehr großer Schritt ist. Begrüßen Sie Applebot.
Ähnlich wie bei Spotlight ist das erklärte Ziel von Apple auch für Safari, Ergebnisse und Vorschläge aus Apples Suchindex anzuzeigen, bevor die Möglichkeit angeboten wird, das Internet mit Google (oder einem anderen ausgewählten Anbieter) zu durchsuchen. Ab iOS 9.1 scheint Safari der Spotlight-Suche hinterherzuhinken, indem es weiterhin Ergebnisse des vom Benutzer gewählten Suchanbieters liefert – vielleicht, um Apple eine langsamere Einführung seiner Suchfunktionen und mehr Zeit für die Feinabstimmung seiner Algorithmen zu ermöglichen.
Besonders aufregend an der Einführung von iOS 9 ist, dass es iOS-Entwicklern zum ersten Mal die Möglichkeit gibt, sich in diese Suchfunktionen einzuklinken und Inhalte aus Apps einzubinden . Darüber hinaus wird versprochen, dass die Suche letztendlich Ergebnisse enthalten wird, die nicht auf dem Telefon des Benutzers liegen . Das ist ein riesiger Schritt.
Lassen Sie uns das einfach in einen Kontext setzen. Die Suchmaschine von Google hat eine ganze Industrie hervorgebracht, die sich um „SEO“ dreht – den Prozess der Optimierung Ihrer Assets rund um die Google-Suche. Nach dem vollständigen Start wird die Suchmaschine von Apple etwa 50 % des mobilen Suchmarktes besitzen, was 50 % (und wächst) des gesamten Suchverkehrs ausmacht. Applebot ist also groß, was bedeutet, dass „Apple Mobile Search Optimization“ auch groß sein wird.
Die Bemühungen zur Optimierung der mobilen Suche von Apple werden einen viel größeren Einfluss auf die App-Erkennung durch mobile Benutzer haben als normales SEO.
Willkommen in der neugeborenen AMSO-Branche.
Die schlechte Nachricht ist, dass die Implementierung all dieser Funktionen viele neue Technologien von Apple sowie Verbesserungen an alten beinhaltet, und die Kombination dieser Elemente kann verwirrend sein. Das Ziel dieser Serie ist es, durch die verschiedenen Teile zu gehen und zu verdeutlichen, wie sie implementiert werden könnten. Beginnen wir mit etwas Grundlegendem und bauen darauf auf.
Zur Unterstützung dieser Serie habe ich durchgehend eine einfache App als Referenz erstellt. Das Projekt ist hier zu finden: https://github.com/rwforsythe/iOS9-Search. Es wird auch aktualisiert, da diese Reihe weiterhin andere Elemente des Such-Toolkits abdeckt.
Die Grundlage: CoreSpotlight Framework
Dieses Framework, das in iOS 9 völlig neu ist, ermöglicht es Ihnen, Elemente zum lokalen Suchindex des iPhones hinzuzufügen, damit sie vom Benutzer gefunden werden können. Beispielsweise konnten vor iOS 9 nur Inhalte in den offiziellen Apple-Apps wie Kalender über die Spotlight-Suche gefunden werden. Jetzt kann jede App, die ihre Kalenderereignisse über das CoreSpotlight-Framework veröffentlicht, über die Spotlight-Suche und sogar Siri gefunden werden.
Beachten Sie, dass der Fokus hier auf persönlichen Informationen liegt; Sie möchten nicht, dass Ihre persönlichen Kalenderereignisse von Benutzern auf einem anderen Telefon gefunden werden! Apple macht sehr deutlich, dass das CoreSpotlight-Framework ausschließlich mit dem privaten Index auf dem Telefon jeder Person interagiert. Es ist nicht möglich, die CoreSpotlight-API zu verwenden, um Inhalte außerhalb des eigenen Index des Telefons zu veröffentlichen.
Das bedeutet nicht, dass CoreSpotlight nicht verwendet werden kann, um bereits öffentliche Informationen zu indizieren. Es ist sicherlich möglich, CoreSpotlight zu verwenden, um Informationen aus der Cloud zu ziehen und sie in den Suchindex des Telefons zu platzieren. Es ist einfach eine Garantie von Apple, dass persönliche und vertrauliche Informationen, die mit CoreSpotlight indiziert werden, auch vertraulich bleiben.
Das Framework besteht aus zwei Teilen: dem CSSearchableItemAttributeSet- Objekt, das es der App ermöglicht, jedes Element detailliert zu beschreiben, und einem CSSearchableItem- Objekt, das verwendet wird, um dem Element eine eindeutige ID zuzuweisen. Jeder Spotlight-Eintrag besteht aus einem Paar dieser Objekte. Der Grund für die Verwendung von zwei Objekten anstelle von einem ist, dass CSSearchableItemAttributeSet- Objekte für eine andere Art von Suchinteraktion verwendet werden (später beschrieben).
Es ist ziemlich einfach, die Grundlagen zu tun.
Für diejenigen, die auf den Beispielcode verweisen, erfolgt die Einrichtung von CoreSpotlight in AppDelegate.
… @import CoreSpotlight; @import MobileCoreServices; …
Diese beiden Module werden für die neue Funktionalität benötigt.
Der Einfachheit halber wird in der Demo-App die Methode application:didFinishLaunchingWithOptions: verwendet, um eine dedizierte Methode zum Einrichten von CoreSpotlight aufzurufen:
if ([CSSearchableItemAttributeSet class]) [self setUpCoreSpotlight]; //Check for iOS version that supports CoreSpotlight API
Wenn wir uns der setUpCoreSpotlight- Methode zuwenden, beginnen wir den Prozess, indem wir ein CSSearchableItemAttributeSet- Objekt erstellen:
CSSearchableItemAttributeSet * attributeSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:(NSString *)kUTTypeItem];
Der Inhaltstyp ist wichtig, da er die allgemeine Art und Weise bestimmen soll, in der das Element von den Suchalgorithmen behandelt wird. „Angeblich“ ist das operative Wort, da dies ein Bereich ist, der von Apple nicht gut dokumentiert ist. Es gibt ein großes Menü von Elementtypen zur Auswahl (Bildtypen, Videotypen, Audiotypen, ein Kontakttyp), aber es ist Versuch und Irrtum erforderlich, um festzustellen, welche Auswirkungen (falls vorhanden) es auf die Erfahrung des Benutzers hat. Einige Typen scheinen mehr Textinhalte anzuzeigen als andere, wenn sie in den Suchergebnissen angezeigt werden. Es kann sich auch darauf auswirken, ob zusammen mit dem Ergebnis ein Miniaturbild angezeigt wird. kUTTypeItem ist ein großartiger Ausgangspunkt.
Beschreiben Sie nun das Objekt genauer:
attributeSet.displayName = @"A Christmas Carol"; attributeSet.title = @"A Christmas Carol By Charles Dickens"; //Sounds similar to displayName but is not displayed to user attributeSet.contentDescription = @"Who would dare to say “Bah! Humbug” after reading A Christmas Carol? Charles Dickens wrote the novella in just six weeks before it was first published on December 19 1843 but his morality tale about a bitter old miser named Ebenezer Scrooge lives on to this day as a reminder of the importance of the Christmas spirit."; attributeSet.keywords = @[@"A Christmas Carol", @"Charles Dickens", @"Victorian Literature"]; UIImage *image = [UIImage imageNamed:@"CC-Cover"]; NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(image)]; attributeSet.thumbnailData = imageData;
Es gibt viele mögliche Eigenschaften, die für Medientypen wie Bilder, Videos usw. spezifisch sind. Mehr Informationen sind wahrscheinlich besser, aber es ist Versuch und Irrtum erforderlich, um festzustellen, welche Informationen tatsächlich verwendet und/oder in den Suchergebnissen angezeigt werden. Zum Zeitpunkt des Verfassens dieses Artikels scheinen beispielsweise Sternbewertungen für ein bestimmtes Indexelement nicht angezeigt zu werden, selbst wenn das attributeSet Sternebewertungsdaten enthält.

Die meisten Texteigenschaften werden in die Suchabfrage einbezogen, sodass der Text über die Suche gefunden werden kann, obwohl die Titeleigenschaft nicht angezeigt wird. Es ist daher nicht ganz klar, wie sich die Eigenschaft keywords grundlegend von der Eigenschaft title unterscheidet.
Weitere Informationen finden Sie im Dokument von Apple: developer.apple.com
Der letzte Schritt besteht darin, das CSSearchableItemAttributeSet mit CSSearchableItem zu packen und es mit dem Index zu registrieren.
CSSearchableItem *item1 = [[CSSearchableItem alloc] initWithUniqueIdentifier:@”https://www.notestream.com/streams/564159e4e5c24” domainIdentifier:@"notestream.com" attributeSet:attributeSet];
Hier zwei neue Sachen. Die domainIdentifier- Eigenschaft ermöglicht es Ihnen, Elemente für Stapelvorgänge zu gruppieren. Beispiel: @"meetingItem" und @"reminderItem" in einer Kalender-App würden es Ihnen ermöglichen, alle Spotlight-Einträge einer Art zu löschen, während Sie die andere verlassen.
Die Eigenschaft uniqueIdentifier spielt eine wichtigere Rolle. Erstens wird es an Ihre App zurückgegeben, wenn der Benutzer auf ein Element im CoreSpotlight-Index klickt (später besprochen). Zweitens gibt es Empfehlungen von Apple, wie dies aussehen sollte, wenn andere Elemente der Suchinfrastruktur verwendet werden. Im Moment verwenden wir eine Zeichenfolge, die tatsächlich eine URL ist, die dieses Element eindeutig darstellt. Technisch gesehen könnte diese Eigenschaft eine beliebige Zeichenfolge sein, solange sie für das Element eindeutig ist.
Der letzte Schritt: Schieben Sie die von Ihnen erstellten Elemente in den eigentlichen Index.
[[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:@[item1, item2, item3] completionHandler: ^(NSError * __nullable error) { if (!error) NSLog(@"Search item(s) journaled for indexing."); }];
Ein paar Punkte, die hier anzumerken sind:
Diese Methode nimmt ein Array von Objekten (und es gibt andere Methoden, die zum Stapeln des Prozesses verwendet werden können, wenn viele Daten zu indizieren sind).
Es ist wichtig zu wissen, dass diese Methode den Indizierungsprozess nicht wirklich abschließt. Der Vervollständigungshandler wird nur aufgerufen, wenn Ihre Suchelemente für die Indizierung in die Warteschlange gestellt wurden. Verwenden Sie CSSearchableIndexDelegate , um Szenarien zu behandeln, in denen der Indizierungsprozess selbst aus irgendeinem Grund fehlschlägt und Ihre App die Situation bewältigen muss.
Herzlichen Glückwunsch, Sie haben Elemente zum CoreSpotlight-Suchindex des Telefons hinzugefügt!
So funktioniert die Suche in iOS 9
Natürlich behält Apple seine Suchalgorithmen dicht bei sich, sodass es sich lohnt, die Beispiel-App zu installieren und mit Schlüsselwörtern herumzuspielen. Zum Beispiel wird schnell deutlich, dass Apple die präsentierten Ergebnisse maximiert, indem es sehr unterschiedliche Ergebnisse liefert, wenn der Benutzer jeden Buchstaben eintippt:
Es sieht so aus, als ob das Prinzip darin besteht, dass die Ergebnisse, die für geeigneter gehalten werden, präsentiert werden, nachdem nur ein paar Buchstaben getippt wurden. Wenn der Benutzer mehr Buchstaben eingibt, werden diese frühen Ergebnisse verworfen und stattdessen andere Dinge (ursprünglich als weniger wahrscheinlich eingeschätzt) angezeigt.
Allgemeiner gesagt hat Apple nur wenige Dinge darüber zu sagen, wie man das Ranking unter seinen Algorithmen verbessern kann. Diese Seite enthält die Empfehlungen von Apple: Verbessern Sie Ihre Suchergebnisse
Eine der wichtigsten Erkenntnisse aus der Apple-Dokumentation ist, dass das Ranking verbessert wird, wenn die App mehrere Suchtechnologien zum Indexieren von Inhalten verwendet. Wir werden uns im nächsten Artikel mit einer anderen dieser Technologien befassen. In der Zwischenzeit müssen wir noch Code implementieren, um das Szenario zu handhaben, wenn ein Benutzer auf ein Suchergebnis klickt.
Wenn der Benutzer klickt
Wir haben den Code erstellt, um den Index mit potenziellen Suchergebnissen zu füllen, aber was passiert, wenn der Benutzer auf ein Ergebnis klickt? Die Antwort ist, dass CoreSpotlight die Methode application:continueUserActivity:restorationHandler:
aus dem UIApplicationDelegate-Protokoll entlehnt. Dies wurde ursprünglich in iOS 8 für den Handoff-Mechanismus eingeführt, mit dem Benutzeraktivitäten von Gerät zu Gerät weitergegeben werden können (z. B. ein Benutzer sieht eine Web-URL auf einer iWatch, verwendet Handoff, um sie im iPhone-Safari-Browser aufzunehmen und schließlich anzuzeigen auf ihrem Mac, wenn sie ins Büro kommen.)
Die erste Herausforderung besteht darin, festzustellen, ob die Methode aufgrund einer Handoff-Aktivität oder von der Spotlight-Suche aufgerufen wurde. Die Eigenschaft activityType des Aktivitätsparameters sagt es Ihnen, aber wenn der Code unter iOS 8 ausgeführt werden könnte, müssen Sie in diesem Fall einen Absturz vermeiden.
So könnte ein einfacher Code hier aussehen:
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)activity restorationHandler:(void (^)(NSArray *))restorationHandler { NSString * valueCSSearchableItemActionType; BOOL wasHandled = NO; if ([CSSearchableItemAttributeSet class]) //iOS 9 { valueCSSearchableItemActionType = CSSearchableItemActionType; } else { // iOS 8 – This method was introduced in iOS 8, so iOS 7 is not a possible scenario valueCSSearchableItemActionType = @"not supported"; } if ([activity.activityType isEqual: valueCSSearchableItemActionType]) { // Invoked via CoreSpotlight, we can assume iOS 9 from now on… NSString * activityIdentifier = [activity.userInfo valueForKey:CSSearchableItemActivityIdentifier]; wasHandled = YES; NSLog(@"Continuing user activity %@", activityIdentifier); } else { //the app was launched via Handoff protocol //or with a Universal Link } return wasHandled; }
Beachten Sie die Codezeile:
NSString * activityIdentifier = [activity.userInfo valueForKey:CSSearchableItemActivityIdentifier];
Dadurch wird der eindeutige Bezeichner extrahiert, der beim Erstellen des CSSearchableItem- Objekts in den Spotlight-Index eingefügt wurde. Natürlich sollte Ihre App diese eindeutige Kennung verwenden, um dem Benutzer den Inhalt zu präsentieren, den er aus dem Suchindex ausgewählt hat. Der Einfachheit halber protokollieren wir hier nur die eindeutige Kennung.
Rekapitulieren
Bisher haben wir nur einen Teil der Suchfunktion von iOS 9 untersucht. Wir haben die Kernfunktionen durchlaufen, die erforderlich sind, um den Spotlight-Suchindex des Telefons mit Dingen zu laden, die der Benutzer nützlich finden könnte: Dokumente, Kalendereinträge, Kontakte und so weiter. Wenn der Benutzer nach etwas sucht, ein Ergebnis Ihrer App sieht und darauf klickt, kann die App die Anfrage bearbeiten und das entsprechende Element für den Benutzer anzeigen.
Was wir noch nicht besprochen haben, sind die Technologien, die sich auf den öffentlichen Index beziehen, den Apple erstellt. Dieser Index soll es Benutzern ermöglichen, Inhalte in Ihrer App zu finden, auch wenn sie nicht auf ihrem Telefon installiert sind. Das gehen wir im nächsten Beitrag an.