iOS实现APP支持SpotLight搜索
#import <CoreSpotlight/CoreSpotlight.h>
CoreSpotlight.framework
参考:http://blog.csdn.net/a416863220/article/details/51220375;
NSUserActivity(参考:http://www.jianshu.com/p/2ec61e2c00cb)
NSUserActivity包含了一些新的方法和属性来帮助我们实现索引activities和应用状态使他们在搜索结果中可用。每一个应用都可以利用NSUserActivity API来生成对于用户来说更有用的内容。顺便提一句NSUserActivity在iOS8中的Handoff就已经被引入了。
@interface LilithViewController ()
// 注意:必须是强引用
@property (nonatomic, strong)NSUserActivity *activity;
@end
@implementation LilithViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
self.navigationItem.title =@"Lilith";
[selfaddUserActivity];
}
- (void)addUserActivity{
// 使用唯一标识符 @"lilith"创建一个新的NSUserActivity对象
// 这个工程已经被配置成确保使用这个标识符时要保证它不会被改变
_activity = [[NSUserActivity alloc]initWithActivityType:@"lilith"];
// 这就是将会在Spotlight搜索结果里出现的内容
_activity.title = @"Lilith";
// 搜索的关键字
// 为了确保可搜寻的内容不仅止限于应用的标题,你也要提供一系列的关键字
_activity.keywords = [NSSet setWithArray:@[@"Lilith"]];
// 是否将用户活动转交到其他设备
_activity.eligibleForHandoff = NO;
// 是否显示历史搜索记录
_activity.eligibleForSearch = YES;
// 它自动的被加入到了设备的搜索结果索引中
[_activity becomeCurrent];
// 过期时间,比如新闻一周后就过期
// _activity.expirationDate =
// 每个控制器的user activity和搜索结果都是仅当应用曾经被打开过时而创建的
// _activity.eligibleForPublicIndexing = YES;
[_activity becomeCurrent];
}
********************
在AppDelegate方法中监听Spotlight中的点击
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *_Nullable))restorationHandler
{
UINavigationController *navi = (UINavigationController *)self.window.rootViewController;
[navi.topViewControllerrestoreUserActivityState:userActivity];
returnYES;
}
在ViewController中实现跳转
- (void)restoreUserActivityState:(NSUserActivity *)activity{
if ([activity.titleisEqualToString:@"Adam"]) {
AdamViewController *adamView = [[AdamViewControlleralloc]init];
[self.navigationController pushViewController:adamView animated:YES];
}elseif([activity.titleisEqualToString:@"Lilith"]){
LilithViewController *lilithView = [[LilithViewControlleralloc]init];
[self.navigationController pushViewController:lilithView animated:YES];
}else if([activity.titleisEqualToString:@"Eve"]){
EveViewController *eveView = [[EveViewControlleralloc]init];
[self.navigationController pushViewController:eveView animated:YES];
}
}
====================
Web Markup
这一特性允许应用镜像自己的内容,并在Spotlight中建立自己的引用。苹果的爬虫会抓取你的网站上打了markup的内容,而这些内容会提供给Safari和Spotlight。这个特性的神奇之处在于。用户不需要将你的应用安装在手机上。这样你的应用可以更多的展示给潜在用户。苹果的云服务会索引你的内容,让你的应用与Public Search API保持深度的链接会让你收益颇多。
Core Spotlight
新的CoreSpotlight(framework)是iOS9提供的一组新的API来帮助你建立起你的应用中的索引。CoreSpotlight是用来处理用户数据的比如:文档,照片以及其他类型的由用户产生的内容。
- (void)saveData{
NSMutableArray *seachableItems = [NSMutableArraynew];
[self.titleArrenumerateObjectsUsingBlock:^(NSString *__nonnull obj,NSUInteger idx, BOOL *__nonnull stop) {
/*创建属相集合,应用内搜索,想搜索到多少个界面就要创建多少个set,每个set都要对应一个item,*/
CSSearchableItemAttributeSet *attributeSet = [[CSSearchableItemAttributeSetalloc] initWithItemContentType:@"views"];//ContentType就是做一个标记
attributeSet.title = obj;//主标题
attributeSet.contentDescription = [NSStringstringWithFormat:NSLocalizedString(@"spotlight测试 %@", nil),obj];//详细标题
attributeSet.contactKeywords = @[@"自己做的",@"obj02",@"obj03"];//搜索关键字
//设置图片----可以通过data设置,可以通过url设置
UIImage *thumbImage = [UIImageimageNamed:@"tg"];//缩略图
attributeSet.thumbnailData =UIImagePNGRepresentation(thumbImage);
//这里的url也必须是本地文件路径,而不是网络图片url
// firstSet.thumbnailURL = [NSURL URLWithString:@"http://www."];
//一个条目中的属性集合和搜索的唯一标示UniqueIdentifier和删除的唯一标识domainIdentifier绑定。UniqueIdentifier每个搜索都有一个唯一标示,当用户点击搜索到得某个内容的时候,系统会调用代理方法,会将这个唯一标示传给你,以便让你确定是点击了哪一,方便做页面跳转
//domainIdentifier搜索域标识,删除条目的时候调用的delegate会传过来这个值
CSSearchableItem *item = [[CSSearchableItemalloc] initWithUniqueIdentifier:obj domainIdentifier:@"com.kdanmobile.CoreSpotlightDemo" attributeSet:attributeSet];
[seachableItems addObject:item];//条目集合
}];
//吧条目集合添加上索引
[[CSSearchableIndexdefaultSearchableIndex] indexSearchableItems:seachableItems
completionHandler:^(NSError *__nullable error) {
if (!error)
NSLog(@"%@",error.localizedDescription);
}];
}
=======实现例子二:
- (void)setupSpotlight
{
if ([UIDevicecurrentDevice].systemVersion.floatValue < 9.0) {
return;
}
//搜索的时候是根据title(主标题),contentDescription(副标题),contactKeywords(关键字集合),来搜索的。
/*应用内搜索,想搜索到多少个界面就要创建多少个set,每个set都要对应一个item*/
CSSearchableItemAttributeSet *firstSet = [[CSSearchableItemAttributeSetalloc]initWithItemContentType:@"第一"];
//标题
firstSet.title =@"one";
//详细描述
firstSet.contentDescription =@"第一个";
//关键字
firstSet.contactKeywords = @[@"first",@"测试",@"firstView"];
//设置图片
//这里的url也必须是本地文件路径,而不是网络图片url
// firstSet.thumbnailURL = [NSURL URLWithString:@"http://www."];
//也可以用这个图片加载方法
firstSet.thumbnailData =UIImagePNGRepresentation([UIImageimageNamed:@"tg"]);
/*
这里有个小细节:
设置的图片展示的效果系统并不会给你处理,意思是说,如果你传了一张长方形的图片做封面icon,你在搜索列表上展示的icon就是长方形的,如果长宽比很大的话,很很难看,所以这里尽量保证图片趋近去正方形,使得展示效果好看点。
或者在自己裁剪处理下趋近正方形。
*/
CSSearchableItemAttributeSet *secondSet = [[CSSearchableItemAttributeSetalloc]initWithItemContentType:@"第二"];
secondSet.title =@"two";
secondSet.contentDescription =@"第二个";
secondSet.contactKeywords = @[@"second",@"测试",@"secondView"];
secondSet.thumbnailData =UIImagePNGRepresentation([UIImageimageNamed:@"lczq"]);
//一个条目中的属性集合和搜索的唯一标示UniqueIdentifier和删除的唯一标识domainIdentifier绑定。UniqueIdentifier每个搜索都有一个唯一标示,当用户点击搜索到得某个内容的时候,系统会调用代理方法,会将这个唯一标示传给你,以便让你确定是点击了哪一,方便做页面跳转
//domainIdentifier搜索域标识,删除条目的时候调用的delegate会传过来这个值
CSSearchableItem *firstItem = [[CSSearchableItemalloc] initWithUniqueIdentifier:@"firstItem"domainIdentifier:@"first"attributeSet:firstSet];
CSSearchableItem *secondItem = [[CSSearchableItemalloc] initWithUniqueIdentifier:@"secondItem"domainIdentifier:@"second"attributeSet:secondSet];
NSArray *items = @[firstItem,secondItem];
//把上面的设置item都添加进入
[[CSSearchableIndexdefaultSearchableIndex] indexSearchableItems:items completionHandler:^(NSError *_Nullable error) {
if (error) {
NSLog(@"失败%@",error);
}
else {
NSLog(@"成功");
}
}];
}
现在我们点击搜索到相应的项还只能打开我们的应用,如果要实现跳转还需要进行一小步的工作:在AppDelegate中实现
//在APPdelegate中实现这个方法
//点击搜索到的结果,会自动掉用下面的方法,根据搜索标识跳转到相应界面
- (BOOL)application:(nonnullUIApplication *)application continueUserActivity:(nonnullNSUserActivity *)userActivity restorationHandler:(nonnullvoid (^)(NSArray *__nullable))restorationHandler{
//获取点击的搜索唯一标识
NSString *identifier = userActivity.userInfo[@"kCSSearchableItemActivityIdentifier"];
UIViewController *VC =self.window.rootViewController;
if([identifierisEqualToString:@"firstItem"]){
[VC presentViewController:[[OneVCalloc]init]animated:YEScompletion:nil];
}elseif([identifier isEqualToString:@"secondItem"]){
[VC presentViewController:[[TwoVCalloc]init]animated:YEScompletion:nil];
}
returnYES;
}
====删除的方法=========
我们有时候并不是创建完Spotlight索引就没其他事了,可能会在用户的账号退出的时候去对索引进行一个清除,及换账号时候的重建,这时候我们会用到删除索引的功能,apple提供给我们三个方法去:
- (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{
//删除所有的条目
}
iOS实现APP支持SpotLight搜索相关推荐
- SwiftUI 音乐和网络大全之网络音乐播放App支持iTunes搜索与播放(教程含源码)
实战需求 SwiftUI 音乐和网络大全之网络音乐播放App支持iTunes搜索与播放(教程含源码) 本文价值与收获 看完本文后,您将能够作出下面的界面 实战代码 import SwiftUIstru ...
- 百度大字版APP支持语音搜索,老年人也能玩转互联网
导读 随着互联网的迅速普及,越来越多的老年人也加入了使用手机大军,用手机出行.看新闻.学技能等.然而,很多老年人面临不会打字或者眼睛不方便等现实难题.如今,百度大字版APP给老年人上网提供了新思路,支 ...
- 如何使用 iOS 9 的 Core Spotlight 框架
每一代 iOS 都会为全球的开发者们带来新鲜的"小玩意儿"和对现有技术进行提升.显然,最新的 iOS 9 也不例外,开发者们拥有了全新的框架和 APIs 以方便调用.这可以显著地提 ...
- 别只关注M1芯片的苹果笔记本,iOS APP支持在 Mac上运行也是大事
将会在当地时间 11 月 10 日(北京时间 11 月 11 日凌晨 2 点)在 Apple Park 举办发布会,这是苹果在本年度秋季举行的第三次发布会,App Store 上似乎透露出发布会的蛛丝 ...
- 百度文心一言推出内测专用独立 App;暴雪回应被网易起诉:未收到相关诉状;iOS 17或支持第三方应用商店 | 极客头条
「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 屠敏 出品 | CSDN(ID:CSDNnews) ...
- 优化Recorder H5录音:可边录边转码上传服务器,支持微信提供Android IOS Hybrid App源码
文章目录 一.Recorder H5录音库的特性 (1)浏览器支持 (2)功能支持 二.使用预览截图 (1)移动端H5 (2)IOS Hybrid App (3)Android Hybrid App ...
- iOS 9 App Search教程
原文链接 : iOS 9 App Search Tutorial: Introduction to App Search 原文作者 : Chris Wagner 译文出自 : 开发技术前线 www.d ...
- iOS上架App Store详解(图文)
上架基本需求资料 1.苹果开发者账号(如还没账号先申请- 苹果开发者账号申请教程) 2.开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.appl ...
- alfred 常用搜索_如何使用Alfred完善macOS的Spotlight搜索
alfred 常用搜索 Spotlight Search on macOS has gotten a lot better over the last few years, but there's s ...
- iOS直播app原理
一.个人见解(直播难与易) 直播难:个人认为要想把直播从零开始做出来,绝对是牛逼中的牛逼,大牛中的大牛,因为直播中运用到的技术难点非常之多,视频/音频处理,图形处理,视频/音频压缩,CDN分发,即时通 ...
最新文章
- 三维场景图:用于统一语义、三维空间和相机的结构
- 任务切换的基础:模拟任务切换时寄存器的保存与恢复
- 解决ZooKeeper集群搭建 [myid:1] - WARN [QuorumPeer[myid=1]:QuorumCnxManager@685] - Cannot open channel
- find = in a string
- 超详细!带输入输出的十五至尊图你见过吗?
- 一个基于WF的业务流程平台
- Android wpa_supplicant 四次握手 流程分析
- ios的Navigation Controller的学习使用
- Linux下编写简易取号机系统,linux socket编程问题,下面是我做的一个简单的模拟银行排队叫号系统。...
- 3分钟全面了解元数据和数据元
- java 对话 智能,如何用Java实现智能对话机器人
- 基于Proteus的51单片机程序设计及仿真(交通灯控制系统)
- java excel转pdf 的实现_JAVA语言实现excel转pdf文件
- 柯洁将在年内和“阿尔法狗”进行终极人机大战
- redis源码--SDS结构解析
- matlab混沌指数的计算,matlab实现混沌系统最大李雅普诺夫指数
- 福田区有哪些公园好玩 你都去过吗
- 内存不能为read或written的解决方案
- 使用postman注册登录后,原先记录消失
- linux下/proc目录简介