Mostrando contenido de Core Data en Spotlight
Libranner Santos
27 marzo, 20243min de lectura
Spotlight permite a los usuarios buscar rápidamente información en sus dispositivos Apple. Como desarrollador, puedes mostrar información de tu aplicación en Spotlight. En esta oportunidad, veremos cómo podemos hacerlo de manera rápida y fácil utilizando Core Data.
Spotlight y el Core Data Stack
Para configurar Spotlight, debemos modificar la manera en que se inicializa el Core Data stack.
Justo antes de init(inMemory: Bool = false)
, agrega esta declaración:
var spotlightDelegate: NSCoreDataCoreSpotlightDelegate?
Esta variable contendrá la instancia de NSCoreDataCoreSpotlightDelegate
, la cual contiene los métodos necesarios para configurar Spotlight.
Entre las funcionalidades se encuentran:
- Actualiza automáticamente el índice de Spotlight.
- Gestiona los índices.
- Permite personalizar los resultados del índice.
Agrega estas líneas de código antes de la llamada a loadPersistentStores(completionHandler:)
:
description.type = NSSQLiteStoreTypedescription.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
La primera línea indica el tipo de base de datos; para que Core Data pueda funcionar, es obligatorio que sea una base de datos SQLite. También debemos habilitar el Historial de Persistencia asignando true
a la opción NSPersistentHistoryTrackingKey
.
Justo después de loadPersistentStores(completionHandler:)
, agrega estas líneas:
spotlightDelegate = NSCoreDataCoreSpotlightDelegate(forStoreWith: description,coordinator: container.persistentStoreCoordinator)spotlightDelegate?.startSpotlightIndexing()
Con este código inicializamos NSCoreDataCoreSpotlightDelegate
usando forStoreWith
y el persistentStoreCoordinator
del Core Data stack. Por último, llamamos startSpotlightIndexing()
para indicar que queremos indexar nuestros datos y ponerlos a disposición de Spotlight.
Con este código inicializamos NSCoreDataCoreSpotlightDelegate
usando description
y el persistentStoreCoordinator
del Core Data stack. Por último, llamamos a startSpotlightIndexing()
para indicar que queremos indexar nuestros datos y ponerlos a disposición de Spotlight.
El código final debería lucir así:
...let container: NSPersistentContainervar spotlightDelegate: NSCoreDataCoreSpotlightDelegate?init(inMemory: Bool = false) {container = NSPersistentContainer(name: "EasyReminder")if inMemory {container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")}guard let description = container.persistentStoreDescriptions.first else {fatalError("###\(#function): Failed to retrieve a persistent store description.")}description.type = NSSQLiteStoreTypedescription.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)container.loadPersistentStores(completionHandler: { (storeDescription, error) inif let error = error as NSError? {fatalError("Unresolved error \(error), \(error.userInfo)")}})spotlightDelegate = NSCoreDataCoreSpotlightDelegate(forStoreWith: description,coordinator: container.persistentStoreCoordinator)spotlightDelegate?.startSpotlightIndexing()container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicycontainer.viewContext.automaticallyMergesChangesFromParent = true}
Configurando la entidad y el atributo
Primero, indica el campo que deseamos mostrar en los resultados de Spotlight. Para hacerlo, seleccionamos la entidad en el editor de Core Data de Xcode y, en el campo Display name, en la sección Spotlight, escribimos el nombre del campo. Para este ejemplo, usamos el campo note.
Necesitamos indicar que deseamos indexar el campo para que se utilice en Spotlight. Esto se logra seleccionando el atributo y marcando la casilla Index in Spotlight.
Ahora, al abrir Spotlight y escribir algún dato que coincida con los valores del campo que hemos marcado para indexar, podremos observar los resultados y seleccionarlos. Por defecto, esto abrirá la aplicación.