iOS 中 spotlight 功能实现

2018-05-30  本文已影响0人  zeus_s

    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 方法

上一篇下一篇

猜你喜欢

热点阅读