2016-07-25 10 views
5

In der E-Mail-App oder in der Nachrichten-App können Sie mithilfe der Core Spotlight-Suche nach dem Inhalt einer Nachricht suchen. Ich kann OneNote auch so sehen, also sollte es in APIs verfügbar sein.Indexieren von Inhalten mit Core Spotlight

Dokumentation darüber ist jedoch fast keine existent. Ich kann nur sehen, dass in CSSearchableItemAttributeSet gibt es contentUrl, aber ich habe versucht, NSUrl der TXT-Datei und nichts passiert ist. Auch versucht, contentType auf kUTTypeText und kUTTypeUTF8PlainText setzen, aber keine Verbesserungen.

Ist ein bestimmtes Dateiformat erforderlich? Oder etwas anderes, was man tun sollte?

+0

so sind Ihre Daten Nachrichten? Für welche Attribute legen Sie derzeit Werte fest? der Betreff oder Textinhalt? – Wain

+0

Warum können Sie nicht einfach die TXT-Datei in Ihrer App verlinken? Ich weiß, dass dies ein Hack für Ihren Fall sein wird, aber Ihr Problem auch lösen kann. Um Deeplink zu setzen, setze den eindeutigen Bezeichner und hole ihn in '- (BOOL) Anwendung: (UIApplication *) application continueUserActivity: (nichtnull NSUserActivity *) userActivity restorationHandler: (nichtnull void (^) (NSArray * _Nullable)) restorationHandler {}' in AppDelegate.m –

+0

@Wain, Daten werden vom Benutzer gespeichert, also theoretisch kann es jeder Text sein, seine übliche Länge beträgt etwa 5000 Zeichen, obwohl es beliebig lang sein kann. Ich setze Titel und ThumbnailUrl, wenn das Item aus dem Web stammt, setze ich auch contentSources. –

Antwort

6

Die Apple documentation on CoreSpotlight bricht den Prozess der Erstellung und das Hinzufügen von Elementen zu einem durchsuchbaren Index:

  • erstellen CSSearchableItemAttributeSet Objekt und geben Sie Eigenschaften, die das Element, das Sie wollen Index beschreiben.

  • Erstellen Sie ein CSSearchableItem-Objekt, das das Element darstellt. Ein CSCarearableItem-Objekt verfügt über eine eindeutige ID, über die Sie später auf verweisen können.

  • Geben Sie bei Bedarf einen Domänenbezeichner an, damit Sie mehrere Objekte zusammenfassen und als Gruppe verwalten können.

  • Verknüpfen Sie den Attributsatz mit dem durchsuchbaren Element.

  • Fügen Sie das durchsuchbare Element zum Index hinzu.

Hier ist ein kurzes Beispiel ich, dass zeigt, wie eine einfache Hinweis Klasse Index:

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

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

Dann in einer anderen Funktion, Notizen erstellen, eine CSSearchableItemAttributeSet für jede Note erstellen, erstellen die Sammlung von durchsuchbaren Elementen einzigartige CSSearchableItem aus dem Attribute gesetzt, und Index:

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) 
    } 
} 

Dieses Beispiel hat Biene n angepasst von AppCoda's How To Use Core Spotlight Framework in iOS 9 Führer.

+0

Ich hatte ein paar Kommentare, löschte sie aber und machte das Experiment. In nicht so kurzen E-Mails (18600 Zeichen) ist JEDES Wort durchsuchbar, einschließlich gängiger Wörter wie "dieses". Ich glaube, dass es die Verwendung der Beschreibung ausschließt und sehr wahrscheinlich Keywords ausschließt. Sind Sie einverstanden? –

+0

@ IvanIčin ist es möglich OneNote enthält eine Liste von Pronomen oder anderen schwarzen Listen, die aus dem durchsuchbaren Text entfernt werden, bevor ein Index für durchsuchbare Elemente erstellt wird. – JAL

Verwandte Themen