iOS实现SpotLight搜索 让你的APP支持SpotLight搜索

随着项目的开发,功能需求越来越多,有的没什么卵用,有的倒是能提示不少逼格,这次接到的功能是实现iOS SpotLight搜索效果。

这个功能很早就有,主要功能是在iOS9系统界面下拉会出现搜索功能界面,在这里可以搜索关键信息,来展示应用内的内容,并且点击信息打开应用跳转具体页面等操作。这个功能还是很有用的,面对这越来越多的应用霸占你手机,给你的应用加上这么一个搜搜功能,还是有点与众不同,主要是提升逼格。看看效果图。

这里可以显示应用内的一些信息,挺丰富的,有图片,标题,副标题。


第一步:首先导入CoreSpotlight.framework框架
在需要实现的界面
#import <CoreSpotlight/CoreSpotlight.h>

比如你的应用是一个新闻类的,有列表页面,点击能进入新闻详情页面,你想在外面能搜索到新闻信息。

然后实现代码

- (void)setupSpotlight  
{  
    if ([UIDevice currentDevice].systemVersion.floatValue < 9.0) {  
        return;  
    }  
      
    /*应用内搜索,想搜索到多少个界面就要创建多少个set ,每个set都要对应一个item*/  
    CSSearchableItemAttributeSet *firstSet = [[CSSearchableItemAttributeSet alloc]initWithItemContentType:@"firstSet"];  
    //标题  
    firstSet.title = @"测试firstView";  
    //详细描述  
    firstSet.contentDescription = @"测试firstView哈哈哈哈哈哈哈";  
    //关键字  
    firstSet.contactKeywords = @[@"first",@"测试",@"firstView"];  
    //设置图片  
    //这里的url也必须是本地文件路径,而不是网络图片url  
//    firstSet.thumbnailURL = [NSURL URLWithString:@"http://www.jf258.com/uploads/2014-09-11/195154600.jpg"];  
    //也可以用这个图片加载方法  
    firstSet.thumbnailData = UIImagePNGRepresentation([UIImage imageNamed:@"耳机"]);  
    /* 
     这里有个小细节: 
     设置的图片展示的效果系统并不会给你处理,意思是说,如果你传了一张长方形的图片做封面icon,你在搜索列表上展示的icon就是长方形的,如果长宽比很大的话,很很难看,所以这里尽量保证图片趋近去正方形,使得展示效果好看点。 
     或者在自己裁剪处理下趋近正方形。 
     */  
      
    CSSearchableItemAttributeSet *secondSet = [[CSSearchableItemAttributeSet alloc]initWithItemContentType:@"secondSet"];  
    secondSet.title = @"测试secondView";  
    secondSet.contentDescription = @"测试secondView哈哈哈哈哈哈哈";  
    secondSet.contactKeywords = @[@"second",@"测试",@"secondView"];  
    secondSet.thumbnailData = UIImagePNGRepresentation([UIImage imageNamed:@"耳机"]);  
      
    //UniqueIdentifier每个搜索都有一个唯一标示,当用户点击搜索到得某个内容的时候,系统会调用代理方法,会将这个唯一标示传给你,以便让你确定是点击了哪一,方便做页面跳转  
    //domainIdentifier搜索域标识,删除条目的时候调用的delegate会传过来这个值  
    CSSearchableItem *firstItem = [[CSSearchableItem alloc] initWithUniqueIdentifier:@"firstItem" domainIdentifier:@"first" attributeSet:firstSet];  
      
    CSSearchableItem *secondItem = [[CSSearchableItem alloc] initWithUniqueIdentifier:@"secondItem" domainIdentifier:@"second" attributeSet:secondSet];  
      
    NSArray *items = @[firstItem,secondItem];  
      
    //把上面的设置item都添加进入  
    [[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:items completionHandler:^(NSError * _Nullable error) {  
        if (error) {  
            NSLog(@"失败%@",error);  
        }  
        else {  
            NSLog(@"成功");  
        }  
    }];  
}  

接下来我自己项目代码实现参考

#pragma mark - Spotlight
- (void)setupSpotlight
{
    NSString *eventLevel = [NSString stringWithFormat:@"赛事级别:%@",self.levels[self.eventDetail.eventLevel]];
    NSString *eventTime = [NSString stringWithFormat:@"赛事时间:%@-%@",[GlobalPublicMethods formatTime:self.eventDetail.eventStratTime format:@"yyyy/MM/dd"], [GlobalPublicMethods formatTime:self.eventDetail.eventEndTime format:@"yyyy/MM/dd"]];
    
    UIImage *spotlightImage = [[YYImageCache sharedCache] getImageForKey:[self.eventDetail.bannerImages firstObject]];
    spotlightImage = [spotlightImage compressImageSize:CGSizeMake(100, 100)];
    
    CSSearchableItemAttributeSet *attributeSet = [[CSSearchableItemAttributeSet alloc]initWithItemContentType:@"EventDetail"];
    attributeSet.title = self.eventDetail.title;
    attributeSet.contentDescription = [NSString stringWithFormat:@"%@\n%@",eventLevel,eventTime];
    attributeSet.thumbnailData = UIImageJPEGRepresentation(spotlightImage, 1.0);
    attributeSet.keywords = @[@"野途",@"wildto",@"赛事",@"级别",@"时间",self.eventDetail.title];
    
    CSSearchableItem *item = [[CSSearchableItem alloc]initWithUniqueIdentifier:self.eventID domainIdentifier:@"赛事详情" attributeSet:attributeSet];
    
    NSArray *items = @[item];
    
    [[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:items completionHandler:^(NSError * _Nullable error) {
        if (error) {
            DLog(@"失败%@",error);
        }
        else {
            DLog(@"成功");
        }
    }];
}

做到这里,你就能够在系统界面下拉搜索到这个app里面保存好的信息,如果实现点击cell打开应用进入具体界面的操作,还必须实现下面的代理方法

第二步:在Appdelegate实现

-(BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler  
{  
    NSString *idetifier = userActivity.userInfo[CSSearchableItemActivityIdentifier];  
    NSLog(@"%@",idetifier);  
      
    UINavigationController *nav = (UINavigationController *)self.window.rootViewController;  
    if ([idetifier isEqualToString:@"firstItem"]) {  
        SpotlightViewController *firstVC = [[SpotlightViewController alloc]init];  
        [nav pushViewController:firstVC animated:YES];  
    }  
    else if ([idetifier isEqualToString:@"secondItem"]){  
        UIViewController *secondVC = [[UIViewController alloc]init];  
        secondVC.title = @"第二个";  
        secondVC.view.backgroundColor = [UIColor orangeColor];  
        [nav pushViewController:secondVC animated:YES];  
    }  
      
    return YES;  
}  

补充:SpotLight还提供了几个删除搜索索引的方法

- (void)deleteSearchableItemsWithIdentifiers:(NSArray<NSString *> *)identifiers completionHandler:(void (^ __nullable)(NSError * __nullable error))completionHandler{  
   //根据标志来删除指定的保存设置  
}  
  
- (void)deleteSearchableItemsWithDomainIdentifiers:(NSArray<NSString *> *)domainIdentifiers completionHandler:(void (^ __nullable)(NSError * __nullable error))completionHandler{  
     
}  
  
- (void)deleteAllSearchableItemsWithCompletionHandler:(void (^ __nullable)(NSError * __nullable error))completionHandler{  
//删除所有的保存设置  
}  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容