还是直插正题,有错误请指出。
Spotlight这个功能很早就有了,可能大部分人觉得这个东西没有什么用。但是如果应用装的很多的时候,比如你装了几百个应用,你很难快速的在桌面上找到你想要的应用。这个时候Spotlight就体现出作用了。iOS9苹果提供了更强大的应用内搜索功能,以前只能搜索到你的app,从iOS9开始你可以搜索到你应用内的某一个功能,用户通过搜索点击可以直接进入应用内的某一功能模块。。。算了还是不墨迹了。。我这个文笔还是非常醉人的,下面开始介绍这个spotlight的简单使用
首先做了一些准备工作,创建项目拉等等,
如上图做了几个简单界面用来做后面的跳转~~~分别设置几个颜色用于区分是哪一个界面。不要问我为啥用这个几个颜色,,,因为我猜你们喜欢黄色。。。
firstView 为橙色view secondView为黄色view
接下来导入头文件 #import <CoreSpotlight/CoreSpotlight.h> 我是在appdelegate 里面导入的,并且在程序启动的时候初始化并设置搜索。
设置Spotlight的方法 *创建CSSearchableItemAttributeSet对象
CSSearchableItemAttributeSet *firstSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:@"firstSet"];复制代码
//标题 firstSet.title = @"测试firstView"; //详细描述 firstSet.contentDescription = @"测试firstView哈哈哈哈哈哈哈"; //关键字, NSArray *firstSeachKey = [NSArray arrayWithObjects:@"first",@"测试",@"firstView", nil]; firstSet.contactKeywords = firstSeachKey; 注:搜索界面显示的属性都是在这里设置的。展示内容,图片等等
*创建CSSearchableItem对象
CSSearchableItem *firstItem = [[CSSearchableItem alloc] initWithUniqueIdentifier:@"firstItem" domainIdentifier:@"first" attributeSet:firstSet];复制代码
注:每个set都要对应一个item。
*设置搜索
[[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:itemArray completionHandler:^(NSError * _Nullable error) {复制代码
if (error) { NSLog(@"设置失败%@",error);
}else{ NSLog(@"设置成功"); } }];
这个样子搜索就设置完了。通过你设置的关键字可以在Spotlight里搜索到你设置的内容,完整方法如下
- (void)setSpotlight{复制代码
/应用内搜索,想搜索到多少个界面就要创建多少个set ,每个set都要对应一个item/ CSSearchableItemAttributeSet *firstSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:@"firstSet"]; //标题 firstSet.title = @"测试firstView"; //详细描述 firstSet.contentDescription = @"测试firstView哈哈哈哈哈哈哈"; //关键字, NSArray *firstSeachKey = [NSArray arrayWithObjects:@"first",@"测试",@"firstView", nil]; firstSet.contactKeywords = firstSeachKey; CSSearchableItemAttributeSet *secondSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:@"secondSet"]; secondSet.title = @"测试SecondView"; secondSet.contentDescription = @"测试secondView哈哈哈哈哈哈哈哈"; NSArray *secondArrayKey = [NSArray arrayWithObjects:@"second",@"测试",@"secondeVIew", nil]; secondSet.contactKeywords = secondArrayKey; //UniqueIdentifier每个搜索都有一个唯一标示,当用户点击搜索到得某个内容的时候,系统会调用代理方法,会将这个唯一标示传给你,以便让你确定是点击了哪一,方便做页面跳转 //domainIdentifier搜索域标识,删除条目的时候调用的delegate会传过来这个值 CSSearchableItem *firstItem = [[CSSearchableItem alloc] initWithUniqueIdentifier:@"firstItem" domainIdentifier:@"first" attributeSet:firstSet]; CSSearchableItem *secondItem = [[CSSearchableItem alloc] initWithUniqueIdentifier:@"secondItem" domainIdentifier:@"second" attributeSet:secondSet]; NSArray *itemArray = [NSArray arrayWithObjects:firstItem,secondItem, nil]; [[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:itemArray completionHandler:^(NSError * _Nullable error) { if (error) { NSLog(@"设置失败%@",error);
}else{ NSLog(@"设置成功"); } }]; }
之后在 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法中调用
NSLog(@"%f",[UIDevice currentDevice].systemVersion.floatValue);复制代码
if ([UIDevice currentDevice].systemVersion.floatValue >= 9.0) { [self setSpotlight]; } 现在设置搜索就设置完了。但是现在点击之后还是只能进入应用不能进入指定的界面。还需要实现下面的代理,在代理方法里面做一些操作
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{复制代码
NSString *idetifier = userActivity.userInfo[@"kCSSearchableItemActivityIdentifier"]; NSLog(@"%@",idetifier); UINavigationController *nav = (UINavigationController *)self.window.rootViewController; UIStoryboard *stroy = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; if ([idetifier isEqualToString:@"firstItem"]) { FirstViewController *fistVc = [stroy instantiateViewControllerWithIdentifier:@"firstView"]; [nav pushViewController:fistVc animated:YES]; }else if ([idetifier isEqualToString:@"secondItem"]){ SecondViewController *secondVc = [stroy instantiateViewControllerWithIdentifier:@"secondView"]; [nav pushViewController:secondVc animated:YES]; } return YES; }
OK,全部完成~~~~系统还给提供了几个删除item的方法
- (void)deleteSearchableItemsWithIdentifiers:(NSArray*)identifiers completionHandler:(void (^ __nullable)(NSError * __nullable error))completionHandler{}- (void)deleteSearchableItemsWithDomainIdentifiers:(NSArray *)domainIdentifiers completionHandler:(void (^ __nullable)(NSError * __nullable error))completionHandler{}- (void)deleteAllSearchableItemsWithCompletionHandler:(void (^ __nullable)(NSError * __nullable error))completionHandler{}复制代码