美文网首页
iOS 中 spotlight 功能实现

iOS 中 spotlight 功能实现

作者: zeus_s | 来源:发表于2018-05-30 11:33 被阅读0次

        spotlight 功能就是指在 iPhone 内搜索应用程序中内容的功能。通俗的说法就是,若是某些界面的一些数据你希望被用户在 spotlight 能搜索到,那么这部分数据用户需要存到本地。在 spotlight 搜索的时候拿到你本地的数据,若是有匹配到的数据那么就会展示出来。大致功能如下图所示:

    spotlight功能演示

    用法简介

    若是想要被 spotlight 搜索到,那么数据格式必须转换为 spotlight 支持的模型。spotlight 支持的类型是 CSSearchableItem,创建 CSSearchableItem 又需要创建 CSSearchableItemAttributeSet 对象,我们通过 spotlight 搜索出的数据就是 CSSearchableItemAttributeSet 对象的各个属性。如图:

    内容属性

    示例代码

    如实想调用spotlight相关功能,首先需要导入CoreSpotlight.framework。工程项目》Build Phases》Link Binary With Libraries》+

    //在你获得一些数据并且希望这些数据能够被检索到时,通过以下方法创建CSSearchableItem并存入本地

    CSSearchableItemAttributeSet *attributeSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:@"image"]; 

    attributeSet.title = @“预测101前三排名”;       

    attributeSet.keywords = @[@“预测101前三排名”,@"创造101",@"孟美岐"];       

    attributeSet.contentDescription = @“山支必须第一,宣仪第二,超越妹子第三好了”;

    attributeSet.thumbnailData = UIImagePNGRepresentation([UIImage imageNamed:message.icon]);                 

    CSSearchableItem *item = [[CSSearchableItem alloc] initWithUniqueIdentifier:@“firstItem” domainIdentifier:@"zeus" attributeSet:attributeSet];

    CSSearchableItem 参数:

    UniqueIdentifier  信息标识符,在进入app时可以通过这个标识符来判断具体跳转入哪个界面

    domainIdentifier  用来区别不同app或者不同模块的标识符

    attributeSet  内容对象

    将包装好的数据存入本地(通过 CSSearchableIndex 来实现)

    //将数据保存到本地,参数 SearchableItems 就是传入元素是 CSSearchableItem 对象的数组

    [[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:searchableItems completionHandler:^(NSError * _Nullable error) {               

        if (error) {           

            NSLog(@"save error");       

        }else {         

              NSLog(@"save success");            

      }           

    }];

    实现以上步骤就可以在 spotlight 中搜索到你设置的相关内容了。如果希望点击到具体信息能够跳转到相关页面,则需要在 AppDelegate 中实现 - (BOOL)application:(UIApplication*)application continueUserActivity:(NSUserActivity*)userActivity restorationHandler:(void(^)(NSArray*_Nullable))restorationHandler 这个方法

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

        NSString *idetifier = userActivity.userInfo[@"kCSSearchableItemActivityIdentifier"];       

        //firstItem 就是前面在创建 CSSearchableItem 对象时传入的参数 UniqueIdentifier

        if ([idetifier isEqualToString:@"firstItem"]) {       

            NSLog(@"跳转到标识为 firstItem 的界面");   

        }       

        return YES;

    }

    至此就可以实现 spotlight 的功能了。具体代码可参考Demo。在demo中,我是通过控制器的 restoreUserActivityState 方法将 userActivity 传给最底层的控制器,让控制器通过标识去判断跳转的具体界面。底层控制器也需要实现 restoreUserActivityState 方法

    相关文章

      网友评论

          本文标题:iOS 中 spotlight 功能实现

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