iOS 中 spotlight 功能实现
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 方法。