iOS App添加Spotlight搜索(附Swift Demo)
原创Blog,转载请注明出处
http://blog.csdn.net/hello_hwc?viewmode=list
我的stackoverflow
前言:最近实在太忙了,已经一周没空写博客了。而且,本来这个月会持续更新设计模式相关的东西,但是还是要抽出时间来写这一篇关于iOS 9新特性的文章。
Why?因为最近要对iOS 9这部分用户提高用户体验,所以整理一下iOS 9这部分的内容
资料/Demo
我习惯性的会把资料放在最前面,因为很多同学其实不会找资料
- WWDC对应的视频
- 一篇还不错的博客
效果
在Spotlight中输入leo,搜到DemoApp的数据,然后点击搜索结果,跳到指定的页面(App为启动,前后台均可以)
Demo下载(Demo是用Swift写的),感兴趣的同学可以下载下来看看
http://download.csdn.net/detail/hello_hwc/9368337
相关的类
两个用到的Framework
import CoreSpotlight
import MobileCoreServices
三个主要的类
- CSSearchableItemAttributeSet,定义一组属性来表述 CSSearchableItem中包含的信息
- CSSearchableItem,实际提交给device index的类
- CSSearchableIndex,负责和device index交互
添加SpotLight搜索内容-CSSearchableItem
每个
CSSearchableItem
由一个CSSearchableItemAttributeSet
来描述它呈现在搜索结果中的样子。
先创建一个`CSSearchableItemAttributeSet`来描述展示在搜索结果中的样子
let attributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeImage as String)attributeSet.title = profile.titleattributeSet.contentDescription = profile.subTitleattributeSet.phoneNumbers = [profile.phone]attributeSet.supportsPhoneCall = NSNumber(int: 1)attributeSet.thumbnailData = UIImagePNGRepresentation(profile.image)attributeSet.keywords = ["leo"]
对照着效果,我们来看看都指向哪一部分内容,
当然,CSSearchableItemAttributeSet
还可以提供更多的属性,这里就不一一列举了,看看文档很容易就知道了,Demo中列出的就是常用的。
搜索的时候会根据字符串进行搜索,所以,及时不设置keywords也能搜索到
然后,创建CSSearchableItem
let item = CSSearchableItem(uniqueIdentifier: "\(index)", domainIdentifier: "com.leo.demo", attributeSet: attributeSet)
这里的
- uniqueIdentifier用来唯一确认一个搜索Item,通过这个uniqueIdentifier可以知道用户点击了哪个item,也可以通过它来删除制定的item
- domainIdentifier,域的概念,用来管理一组items,可以一次性删除一个域下的所有item
然后,添加到CSSearchableIndex中
CSSearchableIndex.defaultSearchableIndex().indexSearchableItems([item], completionHandler: { (error) -> Void inif error != nil{print(error?.localizedDescription)}})
更新CSSearchableItem
更新和添加CSSearchableItem使用同样的API,只要uniqueIdentifier已经存在了,就是更新
删除CSSearchableItem
有一点要记住,添加,删除,更新的时候,使用的类都是CSSearchableIndex
一次删除一组Identifiers
CSSearchableIndex.defaultSearchableIndex().deleteSearchableItemsWithIdentifiers([identifier!], completionHandler: { (error) -> Void inif error != nil{print(error)}})
也可以一次删除一个域下的所有item
CSSearchableIndex.defaultSearchableIndex().deleteSearchableItemsWithDomainIdentifiers
删除全部items
CSSearchableIndex.defaultSearchableIndex().deleteAllSearchableItemsWithCompletionHandler({ (error) -> Void in})
过期时间
可以设置CSSearchableItem的这个属性,来设置过期时间,过期之后device index会自动删除这个item
expirationDate
代理CSSearchableIndexDelegate
Device Index反馈给App处理的结果
例如当batch创建item的时候,有可能在提交的device index的时候失败,通过这个代理来告诉app失败了,要重新提交
//需要重新提交所有items到device index中
searchableIndex:reindexAllSearchableItemsWithAcknowledgementHandler://重新提交指定identifiers到device index中
searchableIndex:reindexSearchableItemsWithIdentifiers:acknowledgementHandler:
处理点击SpotLight中的搜索结果
在这个代理函数中处理
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool
其中,返回true表示app已经处理了NSUserActivity
Demo中,采用Notification的方式来传递给管理的Controller,也可以直接获取ViewController的指针(根据viewController层次关系)
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {if #available(iOS 9.0, *) {//别忘记检查iOS 9if userActivity.activityType == CSSearchableItemActionType{let identifier = userActivity.userInfo?[CSSearchableItemActivityIdentifier] as? StringNSNotificationCenter.defaultCenter().postNotificationName("ContiuneUserActivityNotification", object: NSString(string:identifier!))//发送通知if identifier != nil{ CSSearchableIndex.defaultSearchableIndex().deleteSearchableItemsWithIdentifiers([identifier!], completionHandler: { (error) -> Void inif error != nil{print(error)}})}} else {// Fallback on earlier versions}return true;}
抛砖引玉,这部分不难,感兴趣的同学好好研究下我提到的那三个类就可以了。
iOS App添加Spotlight搜索(附Swift Demo)相关推荐
- 为 iOS APP 添加手机密码、指纹验证
2019独角兽企业重金招聘Python工程师标准>>> 原文 http://my.oschina.net/u/2340880/blog/542221?fromerr=fpdpdLP ...
- iOS App添加扩展App Extension
主要参考文章 : https://www.cnblogs.com/fengmin/p/6118592.html demo地址,里面额外添加了一个分享的扩展 : https://github.com ...
- iOS app添加桌面快捷方式
场景描述:app针对某一功能或者新闻频道,向手机桌面添加一个快捷方式 解决思路: 1.需要一个可以展示的网页,跳转到Safari 2.利用Safari的"添加到主屏幕"的方法,向手 ...
- 如何在ios app 局域网内搜索到设备
现在很多智能家居的app都具有自动扫瞄关联设备的功能,在网上搜索了一下,了解到是通过udp的广播技术来实现的. 然后在网上查找了一些资料后,自己也使用两个app模拟了一下通信过程:其中一个app模拟设 ...
- 给IOS APP 添加启动页步骤
添加启动页比较简单,这里只是记录一下,两个步骤就可以了: 添加图片到Assets中,这里命名为:LaunchImg 点开LaunchScreen.storyboard 拖动一个UIImageView到 ...
- 21个高质量的Swift开源iOS App
原文:21 Amazing Open Source iOS Apps Written in Swift 对Swift初学者来说,学习开源项目,阅读源码是个不错的方法.在这篇文章中,基于对代码质量和排名 ...
- iOS传感器开发——为APP添加手机密码、指纹进行安全验证
iOS传感器开发--为APP添加手机密码.指纹进行安全验证 一.引言 iPhone5s之后,iPhone硬件上已支持进行指纹识别的功能,相应的,一些新的api也可以应用于APP中,进行用户安全的验证. ...
- php图片涂鸦,IOS_详解iOS App中图片的线段涂鸦功能的添加方法,接下来我们要讲图片的涂鸦, - phpStudy...
详解iOS App中图片的线段涂鸦功能的添加方法 接下来我们要讲图片的涂鸦,我们分开一点一点拓展,先给图片上划线 创建项目 起名testAddLine 接下来我们在默认生成的ViewControlle ...
- iOS app 实现热更新(无需发新版本实现app添加新功能)
打包上传太费劲 目前能够实现热更新的方法,总结起来有以下三种 使用FaceBook 的开源框架 reactive native,使用js写原生的ios应用 ios app可以在运行时从服务器拉取最新的 ...
- 【如何给iOS APP加固】之代码混淆及加密 第一章【附代码】
为了给iOS app加固,我们可以采取以下几种方式: 1.代码混淆 代码混淆是通过修改源代码结构和变量名,使得代码难以被理解和反编译.这可以防止黑客获取应用程序的代码,因为即使他们能够获得源代码,也会 ...
最新文章
- Java项目:房屋租赁管理系统(java+SSM+Layui+Maven+Mysql+Jsp)
- (C++)输入输出字符矩阵(二维字符数组)的三种方法
- mongodb jar包_MongoDB是什么?看完你就知道了!
- C++设计模式之适配器模式
- codebrag审核代码工具安装配置
- 怎么看linux电脑是不是双核,Linux系统如何判断CPU是双核还是单核
- python 程序停止打印日志_优雅停止 SpringBoot 服务,拒绝 kill -9 暴力停止!
- 配置独立于系统的PYTHON环境
- 这个省3月23日开始错时错峰开学,在校不要求戴口罩!
- Discuz! 7.1 7.2 远程代码执行漏洞
- .net core 中 Identity Server 4 Topic 之 Startup
- excel字符串截取处理方法
- 手把手教你做短视频去水印微信小程序(5-服务端代码)
- python校园排课选课系统毕业设计开题报告
- Python升级pip失败解决办法
- Shell Bad substitution的解决方法
- wsl2下安装lammps
- 谈谈市面上无线路由器的性能和芯片
- 服务器维修工程师面试,设备维修工程师面试内容有哪些?
- ubuntu升级到8.10后Realplayer11不能播放的问题
热门文章
- android+状态栏显示图标大全,状态栏中的Android显示图标
- HDRP shader 获取阴影(Custom Pass)
- STM32F103_study49_The punctual atoms(STM32 Bit operation and logical operation in C language )
- linux 根目录变为只读了,Linux系统重启或无故变为只读造成网站无法正常访问的简单临时的做 根目录只读不能写处理:...
- 【Python+Selenium】输入关键词自动下载论文
- Ubuntu VirtualBox 安装问题解决
- Efficientnet网络详解及构建
- 齐向东:云计算时代的网络安全更重要
- np.digitize 用法详解
- android wear自动断开,如果你的手表总是自动断开与手机连接的话,可以看下。