Индексирование контента с использованием Core Spotlight

В приложении "Почта" или в приложении "Сообщения" вы можете искать содержимое любого сообщения, используя поиск в Core Spotlight. Также я вижу, как это делает OneNote, поэтому он должен быть доступен в API.

Однако документации по этому вопросу практически не существует. Я могу видеть только то, что в CSSearchableItemAttributeSet есть contentUrl, но я попытался установить NSUrl файла.txt, и ничего не произошло. Также попытался установить contentType в kUTTypeText а также kUTTypeUTF8PlainText но без улучшений.

Требуется ли какой-то определенный формат файла? Или что-то еще нужно сделать?

1 ответ

Документация Apple по CoreSpotlight разбивает процесс создания и добавления элементов в индекс с возможностью поиска:

  • Создайте объект CSSearchableItemAttributeSet и укажите свойства, которые описывают элемент, который вы хотите проиндексировать.

  • Создайте объект CSSearchableItem для представления элемента. Объект CSSearchableItem имеет уникальный идентификатор, который позволяет вам обращаться к нему позже.

  • При необходимости укажите идентификатор домена, чтобы вы могли собирать несколько элементов вместе и управлять ими как группой.

  • Свяжите набор атрибутов с элементом поиска.

  • Добавьте предмет поиска в указатель.

Вот быстрый пример I, который показывает, как индексировать простой класс Note:

class Note {
    var title: String
    var description: String
    var image: UIImage?

    init(title: String, description: String) {
        self.title = title
        self.description = description
    }
}

Затем в какой-то другой функции создайте свои заметки, создайте CSSearchableItemAttributeSet для каждой заметки создайте уникальный CSSearchableItem из набора атрибутов и индексировать коллекцию доступных для поиска элементов:

import CoreSpotlight
import MobileCoreServices

// ...

// Build your Notes data source to index
var notes = [Note]()
notes.append(Note(title: "Grocery List", description: "Buy milk, eggs"))
notes.append(Note(title: "Reminder", description: "Soccer practice at 3"))
let parkingReminder = Note(title: "Reminder", description: "Soccer practice at 3")
parkingReminder.image = UIImage(named: "parkingReminder")
notes.append(parkingReminder)

// The array of items that will be indexed by CoreSpotlight
var searchableItems = [CSSearchableItem]()

for note in notes {
    // create an attribute set of type Text, since our reminders are text
    let searchableItemAttributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeText as String)

    // If we have an image, add it to the attribute set
    if let image = note.image {
        searchableItemAttributeSet.thumbnailData = UIImagePNGRepresentation(image)
        // you can also use thumbnailURL if your image is coming from a server or the bundle
//        searchableItemAttributeSet.thumbnailURL = NSBundle.mainBundle().URLForResource("image", withExtension: "jpg")
    }

    // set the properties on the item to index
    searchableItemAttributeSet.title = note.title
    searchableItemAttributeSet.contentDescription = note.description

    // Build your keywords
    // In this case, I'm tokenizing the title of the note by a space and using the values returned as the keywords
    searchableItemAttributeSet.keywords = note.title.componentsSeparatedByString(" ")

    // create the searchable item
    let searchableItem = CSSearchableItem(uniqueIdentifier: "com.mygreatapp.notes" + ".\(note.title)", domainIdentifier: "notes", attributeSet: searchableItemAttributeSet)
}

// Add our array of searchable items to the Spotlight index
CSSearchableIndex.defaultSearchableIndex().indexSearchableItems(searchableItems) { (error) in
    if let error = error {
        // handle failure
        print(error)
    }
}

Этот пример был адаптирован из руководства AppCoda "Как использовать Core Spotlight Framework в iOS 9".

Другие вопросы по тегам