Индексирование контента с использованием 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".