2015-07-11 6 views
5

Ciao Sto cercando di implementare CoreSpotlight nella mia app.Indexing CoreSpotlight

Quando si esegue l'indicizzazione è necessario eseguirlo ogni volta o è sufficiente eseguirlo una volta quando l'app viene installata per la prima volta? Se l'app viene cancellata devo indicizzarmi di nuovo?

Ecco il codice che sto utilizzando:

- (void)spotLightIndexing { 

    NSString *path = [[NSBundle mainBundle] pathForResource: 
         @"aDetailed" ofType:@"plist"]; 

    NSDictionary *plistDict = [[NSDictionary alloc] initWithContentsOfFile:path]; 
    NSArray *plistArray = [plistDict allKeys]; 

    for (id key in plistDict) { 

     CSSearchableItemAttributeSet* attributeSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:(NSString *)kUTTypeImage]; 

     // Set properties that describe attributes of the item such as title, description, and image. 

     attributeSet.title = key; 
     attributeSet.contentDescription = [plistDict objectForKey:key]; 

//************************************* 

attributeSet.keywords = plistArray; // Another Q: do i need this???? 

//************************************** 

     // Create an attribute set for an item 

     UIImage *image = [UIImage imageNamed:@"icon.png"]; 
     NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(image)]; 
     attributeSet.thumbnailData = imageData; 

     // Create a searchable item, specifying its ID, associated domain, and the attribute set you created earlier. 

     CSSearchableItem *item; 
     NSString *identifier = [NSString stringWithFormat:@"%@",attributeSet.title]; 

     item = [[CSSearchableItem alloc] initWithUniqueIdentifier:identifier domainIdentifier:@"com.example.apple_sample.theapp.search" attributeSet:attributeSet]; 

     // Index the item. 

     [[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:@[item] completionHandler: ^(NSError * __nullable error) { 
         if (!error) 
      NSLog(@"Search item indexed"); 
         else { 
          NSLog(@"******************* E R R O R *********************"); 


     }]; 

    } 
} 

grazie

+0

Il codice funziona ?? perché quando metto questo codice sul mio compilatore di progetto non mi dà output 'Ricerca elemento indicizzato'! –

+0

@ Mc.Lover sì funziona come un fascino!vedi la risposta MODIFICATA per registrare eventuali errori –

+0

Vuoi dare un'occhiata a questa domanda? http://stackoverflow.com/questions/33443833/set-title-property-from-nsarray-in-cssearchableitemattributeset, ho usato il tuo codice ma non ha funzionato! –

risposta

2

sua indicizzati come specificato. Quindi, se metti il ​​tuo metodo spotLightIndexing in didFinishLaunchingWithOptions, indicherà naturalmente gli elementi ogni lancio, a meno che tu non imposti un bool ovviamente. Se l'app viene eliminata, verrà reindicizzata di nuovo quando i valori NSUserDefault verranno azzerati. Ecco perché ti offrono l'aggiunta/modifica/aggiornamento degli indici tramite aggiornamenti in batch o altri metodi come annotato here

Dal momento che il tuo popolamento da un plist locale in contrasto con il web, si dovrà fare gli aggiornamenti da soli o creare un estensione dell'app manutenzione-indice.

Se si guarda il video WWDC su questo argomento, si vedrà che è facile aggiornare o eliminare domini da un "gruppo" utilizzando l'identificativo del dominio. Source È un buon orologio.

Per quanto riguarda le parole chiave, non si può dire fino a quando i documenti non supportano pienamente le API iOS9. Ma solo leggendo quello che Apple ha pubblicamente offerto qui è una nota si dovrebbe considerare:

Importante: Assicurarsi di evitare un eccesso di indicizzazione i contenuti dell'app o l'aggiunta di parole chiave non correlate e attributi, nel tentativo di migliorare il posizionamento del tuo risultati. Poiché iOS misura il livello di coinvolgimento degli utenti con i risultati di ricerca, gli elementi che gli utenti non trovano utili vengono rapidamente identificati e possono eventualmente smettere di mostrare nei risultati.

Che si trova dopo il nuovo riepilogo delle funzioni di ricerca. E continua a dire perché:

Quando si combinano più API di ricerca, gli elementi possono essere indicizzati da più posizioni. Per evitare di fornire agli utenti elementi duplicati nei risultati di ricerca, è necessario collegare gli ID oggetto in modo appropriato. Per garantire che punto gli ID sono collegati, è possibile utilizzare lo stesso valore in proprietà uniqueIdentifier di un elemento ricercabile e nella proprietà relatedUniqueIdentifier all'interno della proprietà contentAttributes di un oggetto NSUserActivity

Quindi, in altre parole, diciamo che incorporano NSUserActivity come essi si intendono perché può essere applicato a tutti gli utenti della tua app, non solo alla persona che esegue l'interrogazione, ma può compilare più volte nella stessa ricerca. Quindi, in base ai suggerimenti di Apples, prova a non utilizzare le parole chiave a meno che non sia sicuro, soprattutto in base al tuo esempio, dove la parola chiave è già = uniqueIdentifier.

Personalmente, l'ho già implementato nella mia app e lo adoro, tuttavia, utilizzo il markup web che rende quasi istantanei gli aggiornamenti batch, a differenza del tuo percorso, in cui dovresti effettivamente spingere un nuovo aggiornamento per aggiornare/cancellare gli indici.

+0

grazie per l'intuizione. L'utilizzo di un plist locale è una decisione che abbiamo preso rispetto al web puramente perché se l'ordine cambia, l'app deve essere aggiornata comunque per incorporare le nuove voci/cancellazioni. –

+0

Sei stato in grado di testare il tuo web markup è stato indicizzato? Come funziona nello sviluppo/debugging? –

+1

potresti elaborare l'indicizzazione batch - (void) beginIndexBatch e endIndexBatchWithClientState: completionHandler? –