Spotlight是iOS 9及以上版本支持的一个新特性,让开发者可以将自己应用内的任何数据放到系统全局索引中,当用户在系统的搜索框中输入关键字时,相关的内容就会被展示出来,点击结果就会跳转到相应的app中,从而提高app的日活。
当用户升级到iOS9系统以后,出现了下面的使用场景:
提供了三个维度让搜索和app内容无缝衔接:
NSUserActivity的索引项是通过NSUserActivity类来实现的,可以索引到用户某个已经浏览过的内容,可以实现从搜索到选中时恢复该活动。
self.activity = [[NSUserActivity alloc] initWithActivityType:@"com.xxx.xxx.xxx"];
self.activity.userInfo = @{@"title": @""};
self.activity.title = @"";
self.activity.keywords = [NSSet setWithObjects:@"", @"", @"", nil];
self.activity.eligibleForHandoff = NO;
self.activity.eligibleForSearch = YES;
[self.activity becomeCurrent];
代码解析:
- (BOOL)application:(UIApplication *)application
continueUserActivity:(NSUserActivity *)userActivity
restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
{
// restore your app state with userActivity.
return YES;
}
Note:声明NSUserActivity时,必须是一个全局的,不能是局部的,否则搜索不到结果。
索引项是CSSearchableItem,添加到app代码中,可以索引到任何app内容。
NSMutableArray *searchableItems = [NSMutableArray array];
for (TestEntity *entity in self.questionList) {
CSSearchableItemAttributeSet *attributeSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:(__bridge NSString *)kUTTypeImage];
attributeSet.title = entity.displayName;
attributeSet.contentDescription = entity.question;
attributeSet.thumbnailData = [NSData dataWithContentsOfURL:[NSURL URLWithString:entity.avatar]];
attributeSet.keywords = @[@"产品", @"运营", @"市场"];
CSSearchableItem *searchableItem = [[CSSearchableItem alloc] initWithUniqueIdentifier:entity.userId domainIdentifier:@"com.xxx.xxx.xxx" attributeSet:attributeSet];
[searchableItems addObject:searchableItem];
}
[[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:searchableItems
completionHandler:^(NSError * _Nullable error) {
if (error) {
} else {
}
}];
代码解析:
当用户点击搜索结果条目时,会跳转到对应的应用,我们需要在应用中显示搜索结果的详细信息。实现方式是实现AppDedelegate中的回调方法:
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)
userActivity restorationHandler:(void(^)(NSArray * __nullable restorableObjects))
restorationHandler {
NSString *itemID = [userActivity.userInfo objectForKey:CSSearchableItemActivityIdentifier];
// 根据itemID跳转到相应界面
return YES;
}
Note:使用CoreSpotlight framework只能将APP内容添加到设备索引中,只能在当前设备搜索,其他设备无法搜索到。要想让你的应用内容被所有用户搜索到,需要用到下面的Web markup。
如果你的应用有对应的网站,可以对网站按照苹果的文档做一些适配,这样苹果的搜索引擎就可以对你的网站进行索引,并将搜索结果和你的应用关联起来。如果你的应用已经安装了,用户点击搜索结果可以自动跳转到你的应用相应的页面;如果你的应用还没有被安装,用户点击搜索结果可以跳转到AppStore引导用户安装你的应用。
官方文档:
https://developer.apple.com/library/content/documentation/General/Conceptual/AppSearch/WebContent.html
但是不幸的是,该功能目前只支持部分国家,还不支持中国。
我们应该在搜索条目不需要的时候将其从设备索引中删除,CSSearchableIndex类提供了3个删除设备索引的方法。
- (void)deleteSearchableItemsWithIdentifiers:(NSArray<NSString *> *)identifiers
completionHandler:(void (^ __nullable)(NSError * __nullable error))completionHandler;
- (void)deleteSearchableItemsWithDomainIdentifiers:(NSArray<NSString *> *)domainIdentifiers
completionHandler:(void (^ __nullable)(NSError * __nullable error))completionHandler;
- (void)deleteAllSearchableItemsWithCompletionHandler:(void (^
__nullable)(NSError * __nullable error))completionHandler;
// xxx配置中心 配置样例如下:
{
"xxxSearchableItems": [
{
"title": "",
"contentDescription": "",
"thumbnailUrl": "",
"actionUrl": ""
},
{
"title": "",
"contentDescription": "",
"thumbnailUrl": "",
"actionUrl": ""
}
],
"RemoveAll": "NO",
"RemoveDomainItems": [
"com.baidu.consult.x",
"com.baidu.consult.xx",
"com.baidu.consult.xxx"
]
}
如果做到以下几点,也会鼓励用户来使用你的app: