Desmitificando iOS 9 Spotlight Buscar para desarrolladores
Publicado: 2022-03-11Hay tres puntos de búsqueda integrados en iOS: Siri, Spotlight Search y Safari search. Siri, una de las características más icónicas de iOS, es algo con lo que la mayoría de los usuarios de iPhone ya están familiarizados. Pero muchas personas no conocen la búsqueda de Spotlight, algo que ha sido una parte integral de iOS mucho antes de que existiera Siri. Se puede acceder a Spotlight Search cuando desliza la pantalla de inicio hacia abajo, o si es nuevo en iOS 9, deslícese hacia la derecha desde su pantalla de inicio personal. Esto revela una barra de búsqueda en la parte superior de la pantalla.
El enfoque de esta herramienta de búsqueda en iOS 8 y versiones anteriores era buscar en el propio teléfono, por lo que su página de resultados enumera las aplicaciones que están en su teléfono, así como correos electrónicos, mensajes y otros elementos privados dentro de las aplicaciones de Apple. También mostrará una definición de Wikipedia si parece relevante. Finalmente, ofrece una opción para buscar en la web a través de Safari como un paso adicional.
A diferencia de Spotlight Search, Safari tiene que ver con el mundo fuera de su teléfono. En iOS 8, el usuario puede elegir qué motor de búsqueda usar para la búsqueda de Safari: Google, Yahoo, Bing y DuckDuckGo. Naturalmente, Google maneja la mayoría de las solicitudes de búsqueda de Safari. Independientemente del motor de búsqueda elegido, los términos de búsqueda precargados se presentan en Safari, posiblemente con una coincidencia de Wikipedia.
En iOS 9, Spotlight Search es mucho más prominente y tiene un alcance más amplio que antes. De hecho, lo primero que ve son "Sugerencias de Siri" basadas en sus patrones de uso. Por ejemplo, si usas Safari regularmente por la tarde, Siri te lo sugerirá a esa hora.
Y, si bien sigue siendo un lugar para encontrar “cosas en tu teléfono”, se está convirtiendo en un portal directo para “cosas que no están en tu teléfono”. Ya ve cosas cercanas y titulares de noticias obtenidos de la web a través del propio motor de búsqueda de Apple, y ahora están empezando a aparecer otros resultados basados en la web.
Sí, Apple ha creado un motor de búsqueda web para iOS 9, que es un paso muy grande. Saluda a Applebot.
De manera similar a Spotlight, el objetivo declarado de Apple para Safari también es mostrar resultados y sugerencias del índice de búsqueda de Apple, antes de ofrecer la capacidad de buscar en la web con Google (u otro proveedor elegido). A partir de iOS 9.1, Safari parece estar rezagado con respecto a la búsqueda de Spotlight al continuar brindando resultados del proveedor de búsqueda elegido por el usuario, tal vez para darle a Apple una implementación más lenta de sus funciones de búsqueda y más tiempo para ajustar sus algoritmos.
Lo que es particularmente emocionante del lanzamiento de iOS 9 es que, por primera vez, brinda a los desarrolladores de iOS la capacidad de conectarse a estas funciones de búsqueda e incluir contenido desde dentro de las aplicaciones . Además, la promesa es que la búsqueda finalmente incluirá resultados que no estén en el teléfono del usuario . Este es un gran paso.
Pongamos esto en contexto. El motor de búsqueda de Google ha generado toda una industria basada en "SEO", el proceso de optimización de sus activos en torno a la búsqueda de Google. Cuando se lance por completo, el motor de búsqueda de Apple poseerá aproximadamente el 50% del mercado de búsqueda móvil, que representa el 50% (y sigue creciendo) del tráfico de búsqueda general. Por lo tanto, Applebot es grande, lo que significa que la "Optimización de búsqueda móvil de Apple" también será grande.
Los esfuerzos de Apple Mobile Search Optimization tendrán un impacto mucho mayor en el descubrimiento de aplicaciones por parte de los usuarios móviles que el SEO normal.
Bienvenido a la recién nacida industria AMSO.
La mala noticia es que la implementación de todas estas funciones implica muchas tecnologías nuevas de Apple, así como la mejora de las antiguas, y la combinación de estos elementos puede resultar confusa. El objetivo de esta serie es recorrer las diversas piezas y aclarar cómo podrían implementarse. Comencemos con algo básico y construyamos sobre eso.
En apoyo de esta serie, he creado una aplicación simple para referencia en todo momento. El proyecto se puede encontrar aquí: https://github.com/rwforsythe/iOS9-Search. También se actualizará a medida que esta serie continúe cubriendo otros elementos del conjunto de herramientas de búsqueda.
La Fundación: Marco CoreSpotlight
Este marco, completamente nuevo en iOS 9, le permite aportar elementos al índice de búsqueda local del iPhone para que el usuario los descubra. Por ejemplo, antes de iOS 9, solo se podía encontrar contenido dentro de las aplicaciones oficiales de Apple, como Calendario, a través de la búsqueda de Spotlight. Ahora, cualquier aplicación que publique sus eventos de calendario a través del marco CoreSpotlight se puede encontrar a través de Spotlight Search e incluso Siri.
Tenga en cuenta que el enfoque aquí está en la información personal; ¡usted no quiere que los usuarios encuentren sus eventos de calendario personal en otro teléfono! Apple tiene muy claro que el marco CoreSpotlight interactúa exclusivamente con el índice privado en el teléfono de cada persona. No es posible utilizar la API de CoreSpotlight para publicar contenido fuera del propio índice del teléfono.
Eso no significa que CoreSpotlight no se pueda usar para indexar información que ya es pública. Ciertamente, es posible utilizar CoreSpotlight para extraer información de la nube y colocarla en el índice de búsqueda del teléfono. Es simplemente una garantía de Apple de que si la información personal y confidencial se indexa con CoreSpotlight, permanecerá confidencial.
El marco consta de dos partes: el objeto CSSearchableItemAttributeSet que permite que la aplicación describa cada elemento en detalle y un objeto CSSearchableItem que se usa para otorgar al elemento una identificación única. Cada entrada de Spotlight se compone de un par de estos objetos. La razón para usar dos objetos en lugar de uno es que los objetos CSSearchableItemAttributeSet se usan para un tipo diferente de interacción de búsqueda (que se describe más adelante).
Es bastante fácil hacer lo básico.
Para aquellos que hacen referencia al código de muestra, la configuración de CoreSpotlight se realiza en AppDelegate.
… @import CoreSpotlight; @import MobileCoreServices; …
Estos dos módulos son necesarios para la nueva funcionalidad.
Para simplificar la aplicación de demostración, el método application:didFinishLaunchingWithOptions: se usa para llamar a un método dedicado para configurar CoreSpotlight:
if ([CSSearchableItemAttributeSet class]) [self setUpCoreSpotlight]; //Check for iOS version that supports CoreSpotlight API
Bajando al método setUpCoreSpotlight , comenzamos el proceso creando un objeto CSSearchableItemAttributeSet :
CSSearchableItemAttributeSet * attributeSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:(NSString *)kUTTypeItem];
El tipo de contenido es importante ya que se supone que rige la forma general en que los algoritmos de búsqueda tratan el elemento. “Supuesto” es la palabra operativa, ya que esta es un área que Apple no ha documentado bien. Hay un gran menú de tipos de elementos para elegir (tipos de imagen, tipos de video, tipos de audio, un tipo de contacto), pero se requiere prueba y error para determinar qué impacto (si lo hay) tiene en la experiencia del usuario. Algunos tipos parecen mostrar más contenido de texto que otros cuando se muestran en los resultados de búsqueda. También puede afectar si se muestra una imagen en miniatura junto con el resultado. kUTTypeItem es un excelente lugar para comenzar.
Ahora describe el objeto con más detalle:
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;
Hay muchas propiedades posibles, específicas para tipos de medios como imágenes, videos, etc. Probablemente sea mejor tener más información, pero se necesita prueba y error para determinar qué información se usa y/o se muestra realmente en los resultados de búsqueda. En el momento de escribir este artículo, por ejemplo, las calificaciones con estrellas parecen no mostrarse para un elemento de índice determinado, incluso si el conjunto de atributos contiene datos de calificación con estrellas.

La mayoría de las propiedades de texto se incluyen en la consulta de búsqueda, por lo que aunque la propiedad del título no se muestre, el texto se puede encontrar a través de la búsqueda. Por lo tanto, no está del todo claro cómo la propiedad de las palabras clave es fundamentalmente diferente de la propiedad del título.
Consulte el documento de Apple para obtener más información: developer.apple.com
El paso final es empaquetar CSSearchableItemAttributeSet con CSSearchableItem y registrarlo con el índice.
CSSearchableItem *item1 = [[CSSearchableItem alloc] initWithUniqueIdentifier:@”https://www.notestream.com/streams/564159e4e5c24” domainIdentifier:@"notestream.com" attributeSet:attributeSet];
Dos cosas nuevas aquí. La propiedad domainIdentifier le permite agrupar elementos para operaciones por lotes. Por ejemplo, @“meetingItem” y @”reminderItem” en una aplicación de calendario le permitiría eliminar todas las entradas de Spotlight de un tipo y dejar el otro.
La propiedad uniqueIdentifier tiene un papel más importante que desempeñar. Primero, se devuelve a su aplicación cuando el usuario hace clic en un elemento del índice de CoreSpotlight (que se analiza más adelante). En segundo lugar, hay recomendaciones de Apple sobre cómo debería ser esto al usar otros elementos de la infraestructura de búsqueda. Por ahora, usaremos una cadena que, de hecho, es una URL que representa de manera única este elemento. Técnicamente, esta propiedad podría ser cualquier cadena, siempre que sea única para el elemento.
El último paso: inserte los elementos que ha creado en el índice real.
[[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:@[item1, item2, item3] completionHandler: ^(NSError * __nullable error) { if (!error) NSLog(@"Search item(s) journaled for indexing."); }];
Un par de puntos para hacer aquí:
Este método toma una matriz de objetos (y hay otros métodos que se pueden usar para agrupar el proceso si hay muchos datos para indexar).
Es importante darse cuenta de que este método en realidad no completa el proceso de indexación. El controlador de finalización solo se llama cuando los elementos de búsqueda se han puesto en cola para la indexación. Use CSSearchableIndexDelegate para manejar escenarios en los que el proceso de indexación falla por algún motivo y su aplicación necesita manejar la situación.
Felicitaciones, ha agregado elementos al índice de búsqueda de CoreSpotlight del teléfono.
Cómo funciona la búsqueda en iOS 9
Naturalmente, Apple mantiene sus algoritmos de búsqueda cerca de su pecho, por lo que vale la pena instalar la aplicación de muestra y jugar con las palabras clave. Por ejemplo, rápidamente se hace evidente que Apple está maximizando los resultados presentados al dar resultados muy diferentes a medida que el usuario escribe cada letra:
Parece que el principio es que los resultados que se consideren más apropiados se presentarán después de haber escrito un par de letras. A medida que el usuario escribe más letras, esos primeros resultados se descartan y en su lugar se presentan otras cosas (que originalmente se estimó que eran menos probables).
En términos más generales, Apple solo tiene algunas cosas que decir sobre cómo mejorar la clasificación según sus algoritmos. Esta página contiene las recomendaciones de Apple: Mejore sus resultados de búsqueda
Uno de los puntos clave de la documentación de Apple es que la clasificación mejora cuando la aplicación utiliza múltiples tecnologías de búsqueda para indexar el contenido. Nos sumergiremos en otra de estas tecnologías en el próximo artículo. Mientras tanto, todavía necesitamos implementar código para manejar el escenario cuando un usuario hace clic en un resultado de búsqueda.
Cuando el usuario hace clic
Hemos creado el código para completar el índice con posibles resultados de búsqueda, pero ¿qué sucede cuando el usuario hace clic en un resultado? La respuesta es que CoreSpotlight toma prestado el método application:continueUserActivity:restorationHandler:
del protocolo UIApplicationDelegate. Esto se introdujo originalmente en iOS 8 para el mecanismo de traspaso que permite que las actividades del usuario pasen de un dispositivo a otro (p. ej., un usuario ve una URL web en un iWatch, utiliza el traspaso para recogerlo en el navegador Safari del iPhone y finalmente verlo). en su Mac cuando llegan a la oficina).
El primer desafío es determinar si se llamó al método debido a una actividad de Transferencia o desde Spotlight Search. La propiedad activityType del parámetro de actividad se lo indicará, pero si el código puede ejecutarse en iOS 8, deberá evitar un bloqueo en ese caso.
Así es como se vería un código simple aquí:
- (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; }
Tenga en cuenta la línea de código:
NSString * activityIdentifier = [activity.userInfo valueForKey:CSSearchableItemActivityIdentifier];
Esto extrae el identificador único que se colocó en el índice de Spotlight cuando se creó el objeto CSSearchableItem . Naturalmente, su aplicación debe usar este identificador único para presentar al usuario el contenido que seleccionó del índice de búsqueda. Para simplificar aquí, simplemente NSLog el identificador único.
Resumen
Hasta ahora, hemos examinado solo una parte de la función de búsqueda de iOS 9. Hemos repasado la funcionalidad principal necesaria para cargar el índice de búsqueda de Spotlight del teléfono con cosas que el usuario puede encontrar útiles: documentos, elementos del calendario, contactos, etc. Cuando el usuario busca algo, ve un resultado de su aplicación y hace clic en él, la aplicación podrá manejar la solicitud y mostrar el elemento apropiado para el usuario.
Lo que aún no hemos discutido son las tecnologías que se relacionan con el índice público que Apple está construyendo. Este índice está destinado a permitir a los usuarios encontrar contenido en su aplicación incluso sin que esté instalada en su teléfono. Eso lo abordaremos en el próximo post.