在WWDC2015会议上,苹果公布了iOS9系统,iOS9系统相比iOS7、iOS8并没有特别大得变化,可以看做是iOS8的基础上进行的平滑的过度。但是新的系统中仍有一些特性和功能值得人们去关注,其中
Search API就是其中之一。通过新的Search API可以实现强大的应用内搜索功能,通过在Spotlight中使用我们设计的所以,来查看app中的界面或是内容。

iOS9的 Search API由三个组件组成:

1.NSUserActivity
2.Web Markup
3.Core Spotlight
现在介绍一下NSUserActivity的使用
NSUserActivity是在iOS8中出现的API,主要用户HandOff功能,iOS9中NSUserActivity新增加了一个属性 eligibleForSearch 来控制在Spotlight中的显示

定义一个NSUserActivity属性

1
@property (nonatomic, strong)NSUserActivity *activity;

初始化NSUserActivity,并设置属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//ActivityType为唯一标识
_activity = [[NSUserActivity alloc]initWithActivityType:@"Eden"];

//title app在Spotlight中显示的名称,可以和app名称不一样,多个app使用相同的keywords,初始通过title名称进行排序
_activity.title = @"Eden";

//Spolight搜索关键字
_activity.keywords = [NSSet setWithArray:@[@"Adam", @"Lilith", @"Eve"]];

//关闭HandOff功能
_activity.eligibleForHandoff = NO;

//开启Spotlight search功能
_activity.eligibleForSearch = YES;

//开启NSUserActivity
[_activity becomeCurrent];

当做完这些操作时候然后运行程序,我们在spotlight中搜索 adam, lilith, eva中的某一个关键字就会找到我们的应用,此时选择应用会直接跳转到app的首页。有时候我们希望最好能通过某个关键字直接跳转到app其中某一页,幸运的是NSUserActivity同样支持这个功能。

准备工作:

创建AdmaViewController,LilithViewController
我们在AdmaViewController中创建adamUserActivity,title为adamView, 关键字adam
我们在LilithViewController中创建lilithUserActivity, title为lilithView,关键字lilith
可以在首页通过adam跳转到admaViewController
可以在首页通过lilith跳转到lilithViewController

开始工作:

找到AppDelegate文件,添加方法

//在主线程下存在可用NSUserActivity对象时候调用

1
2
3
4
5
6
7
8
9
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{

//找到当前的window的rootView转换为UINavigationController(如果你的rootView是UINavigationController的话)
UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;

//找到navigationController的topView(首页) 中restoreUserActivityState方法
[navigationController.topViewController restoreUserActivityState:userActivity];
return YES;
}

在首页中重写restoreUserActivityState方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
- (void)restoreUserActivityState:(NSUserActivity *)activity{
//通过Spotlight中传过来的NSUserActivity对象的title判断具体跳转到哪一页
if ([activity.title isEqualToString:@"Adam"]) {
AdamViewController *adamView = [[AdamViewController alloc]init];
[self.navigationController pushViewController:adamView animated:YES];
}else if([activity.title isEqualToString:@"Lilith"]){
LilithViewController *lilithView = [[LilithViewController alloc]init];
[self.navigationController pushViewController:lilithView animated:YES];
}else if([activity.title isEqualToString:@"Eve"]){
EveViewController *eveView = [[EveViewController alloc]init];
[self.navigationController pushViewController:eveView animated:YES];
}

}

现在当选择再Spotlight中搜索adam,选择应用会直接跳转到 adamViewController中,搜索lilith关键字,选择应用会直接跳转到lilithViewController中

本文代码下载地址