2015-06-26 5 views

ответ

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

attributeSet.title = @"My First Spotlight Search"; 
attributeSet.contentDescription = @"This is my first spotlight Search"; 

attributeSet.keywords = @[@"Hello", @"Welcome",@"Spotlight"]; 

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

CSSearchableItem *item = [[CSSearchableItem alloc] 
             initWithUniqueIdentifier:@"com.deeplink" 
               domainIdentifier:@"spotlight.sample" 
                attributeSet:attributeSet]; 

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

Примечание: kUTTypeImage требует, чтобы вы импортировать рамки MobileCoreServices.

+0

Миниатюры работают с Beta 2 – KIDdAe

+0

Спасибо за фрагмент кода. –

+0

Выглядит неправильно. '' Com.deeplink "' на самом деле должен быть уникальным идентификатором, который однозначно идентифицирует объект, который вы индексируете (например, первичный идентификатор из базы данных или GUUID или что-то еще). 'KUTTypeImage' на CSSearchableItemAttributeSet - это то, где вам нужно установить глубокую ссылку. Пример Apple, отображаемый в их ключевом слове, на самом деле ошибочен и непоследовательен, но правильный пример можно увидеть ранее в видео. – strangetimes

35
  1. Создать новый проект IOS и добавить CoreSpotlight и MobileCoreServices рамки для вашего проекта.

  2. Создайте фактический CSSearchableItem и свяжите уникальныйIdentifier, domainIdentifier и attributeSet. Наконец, индексируйте CSSearchableItem, используя [[CSSearchableIndex defaultSearchableIndex] ...], как показано ниже. enter image description here

  3. ОК! Проверьте индекс!
    enter image description here

+2

Хороший ответ. Но, вероятно, вам следует включить, как разработчики реализуют курс действий после того, как пользователь выбрал и индексирует. – soulshined

+1

HAHA, потому что большинство адептов просто не знают, как начать с API поиска CoreSpotlight. Здесь просто простое руководство. – mayqiyue

+1

Я не был увлекательным. Это был хороший ответ, но отсутствующие элементы, чтобы выполнить верный ответ на этот вопрос. Было бы неплохо включить для будущих искателей вопросов. – soulshined

5

Я использую подобную реализацию, как упомянуто @mayqiyue, но я также проверить существование переменной item для обратной совместимости с прошивкой 8.

- (void)setupCoreSpotlightSearch 
{ 
    CSSearchableItemAttributeSet *attibuteSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:(__bridge NSString *)kUTTypeImage]; 
    attibuteSet.title = NSLocalizedString(@"Be happy!", @"Be happy!"); 
    attibuteSet.contentDescription = @"Just like that"; 
    attibuteSet.keywords = @[@"example", @"stackoverflow", @"beer"]; 

    UIImage *image = [UIImage imageNamed:@"Image"]; 
    NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(image)]; 
    attibuteSet.thumbnailData = imageData; 

    CSSearchableItem *item = [[CSSearchableItem alloc] initWithUniqueIdentifier:@"1" 
                  domainIdentifier:@"album-1" 
                   attributeSet:attibuteSet]; 
    if (item) { 
     [[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:@[item] completionHandler:^(NSError * _Nullable error) { 
      if (!error) { 
       NSLog(@"Search item indexed"); 
      } 
     }]; 
    } 
} 

Чтобы обработать водопроводный кран элемент поиска из Spotlight вам необходимо реализовать следующий метод в AppDelegate:

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler 
{ 
    if ([userActivity.activityType isEqualToString:CSSearchableItemActionType]) { 
     NSString *uniqueIdentifier = userActivity.userInfo[CSSearchableItemActivityIdentifier]; 

     // Handle 'uniqueIdentifier' 
     NSLog(@"uniqueIdentifier: %@", uniqueIdentifier); 
    } 

    return YES; 
} 
6

Чтобы выполнить функцию поиска прожектора, после того как вы внедрили mayqiyue's ответ, вы сможете увидеть результаты поиска, но при выборе результата просто ваше приложение откроет не соответствующий вид с соответствующим контентом.

Для этого перейдите к AppDelegate.m и добавьте следующий способ.

-(BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler 

     { 

      //check if your activity has type search action(i.e. coming from spotlight search) 
      if ([userActivity.activityType isEqualToString:CSSearchableItemActionType ] == YES) { 

       //the identifier you'll use to open specific views and the content in those views. 
       NSString * identifierPath = [NSString stringWithFormat:@"%@",[userActivity.userInfo objectForKey:CSSearchableItemActivityIdentifier]]; 

       if (identifierPath != nil) { 

        // go to YOUR VIEWCONTROLLER 
        // use notifications or whatever you want to do so 

        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil]; 
        MyViewController *myViewController = [storyboard instantiateViewControllerWithIdentifier:@"MyViewController"]; 

        // this notification must be registered in MyViewController 
        [[NSNotificationCenter defaultCenter] postNotificationName:@"OpenMyViewController" object: myViewController userInfo:nil]; 


        return YES; 
       } 

      } 


      return NO; 
     } 

Убедитесь, что импорта в AppDelegate.m:

#import <MobileCoreServices/MobileCoreServices.h> 
#import <CoreSpotlight/CoreSpotlight.h> 

UPDATE для Swift 2.1

func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool { 

    if #available(iOS 9.0, *) { 
     if userActivity.activityType == CSSearchableItemActionType { 

      //the identifier you'll use to open specific views and the content in those views. 
      let dict = userActivity.userInfo! as NSDictionary 
      let identifierPath = dict.objectForKey(CSSearchableItemActivityIdentifier) as! String 
      if identifierPath.characters.count > 0 { 

       let storyboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
       let mvc: MyViewController = storyboard.instantiateViewControllerWithIdentifier("MyViewController") as! MyViewController 

       NSNotificationCenter.defaultCenter().postNotificationName("OpenMyViewController", object: mvc, userInfo: nil) 
      } 

      return true 
     } 

    } else { 
     // Fallback on earlier versions 
      return false 

    } 

    return false 

} 

Убедитесь, что импорта в AppDelegate.скор:

import CoreSpotlight 
import MobileCoreServices 
1
let attributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeImage as String) 
attributeSet.title = "Searchable Item" 
attributeSet.contentDescription = "Code for creating searchable item" 
attributeSet.keywords = ["Item","Searchable","Imagine"] 
attributeSet.thumbnailURL = NSURL(string: "https://blog.imagine.com/") 

let searchableItem = CSSearchableItem(uniqueIdentifier: "com.imagine.objectA", domainIdentifier: "spotlight.search", attributeSet: attributeSet) 
CSSearchableIndex.defaultSearchableIndex().indexSearchableItems([searchableItem]) {_ in} 
+0

Можете ли вы добавить объяснение в свой ответ. Спасибо – Clarkie

5
  1. Написать в основной контроллер класса

    -(void)storeValueForSpotligtSearch { 
    
        NSString *bundleIdentifier      = [[NSBundle mainBundle] bundleIdentifier]; 
        // **Your Model Array that Contain Data Like attributes Make, Model, Variant and Year and Images** 
    
        for (MyCatalogeModel *myCatalogeModelObj in yourDataContainer) { 
         NSMutableArray *arrKeywords     = [[NSMutableArray alloc] initWithObjects: myCatalogeModelObj.year, myCatalogeModelObj.make, myCatalogeModelObj.model, myCatalogeModelObj.variant, nil]; 
         NSString *strIdentifier      = [NSString stringWithFormat:@"%@.%@",bundleIdentifier, myCatalogeModelObj.carId]; 
         self.userActivity       = [[NSUserActivity alloc]initWithActivityType:strIdentifier]; 
         self.userActivity.title      = myCatalogeModelObj.year; 
         self.userActivity.title      = myCatalogeModelObj.make; 
         self.userActivity.title      = myCatalogeModelObj.model; 
         self.userActivity.title      = myCatalogeModelObj.variant; 
         self.userActivity.eligibleForSearch   = YES; 
         self.userActivity.eligibleForPublicIndexing = YES; 
         self.userActivity.eligibleForHandoff  = YES; 
         CSSearchableItemAttributeSet * attributeSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:(NSString *)kUTTypeJSON]; 
         attributeSet.title       = myCatalogeModelObj.make; 
         attributeSet.thumbnailData     = [NSData dataWithContentsOfURL:[NSURL URLWithString:[myCatalogeModelObj.imageArray objectAtIndex:0]]]; 
         attributeSet.contentDescription    = [NSString stringWithFormat:@"%@ %@ %@ %@", myCatalogeModelObj.year, myCatalogeModelObj.make, myCatalogeModelObj.model, myCatalogeModelObj.variant]; 
         attributeSet.keywords      = arrKeywords; 
         CSSearchableItem *item      = [[CSSearchableItem alloc] initWithUniqueIdentifier:strIdentifier domainIdentifier:@"spotlight.CARS24ChannelPartnerapp" attributeSet:attributeSet]; 
         [[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:@[item] completionHandler: ^(NSError * __nullable error) { 
         }]; 
         self.userActivity.contentAttributeSet  = attributeSet; 
         [self.userActivity becomeCurrent]; 
         [self updateUserActivityState:self.userActivity]; 
        } 
    } 
    
  2. Написать в App делегатом

    -(BOOL)application:(nonnull UIApplication *) application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray * __nullable))restorationHandler { 
    
        @try { 
    
         NSString *strIdentifier; 
         NSNumber *numScreenId; 
         NSNumberFormatter *numFormatter = [[NSNumberFormatter alloc] init]; 
         NSLog(@"Activity = %@",userActivity.userInfo); 
         if (userActivity.userInfo[@"vc"]) { 
          numScreenId = userActivity.userInfo[@"vc"]; 
         } 
         else{ 
          strIdentifier = [userActivity.userInfo objectForKey:@"kCSSearchableItemActivityIdentifier"]; 
          NSLog(@"strIdentifier : %@",strIdentifier); 
          NSArray *arr = [strIdentifier componentsSeparatedByString:@"."]; 
          NSString *strScreenId = [arr objectAtIndex:3]; 
          NSLog(@"ID -= %@",strScreenId); 
    
          **// On Click in Spotlight search item move your particular view.** 
    
          [self moveToParticular:[strScreenId intValue]]; 
          numScreenId = [numFormatter numberFromString:strScreenId]; 
         } 
        } 
        @catch (NSException *exception) {} 
    
        return YES; 
    } 
    
+0

@ PeterPan666 спасибо –