美文网首页
iOS实现SpotLight搜索 让你的APP支持SpotLig

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

作者: SAW_ | 来源:发表于2017-03-30 19:13 被阅读677次

    随着项目的开发,功能需求越来越多,有的没什么卵用,有的倒是能提示不少逼格,这次接到的功能是实现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{  
    //删除所有的保存设置  
    }  
    

    相关文章

      网友评论

          本文标题:iOS实现SpotLight搜索 让你的APP支持SpotLig

          本文链接:https://www.haomeiwen.com/subject/fempottx.html