原创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)相关推荐

  1. 为 iOS APP 添加手机密码、指纹验证

    2019独角兽企业重金招聘Python工程师标准>>> 原文  http://my.oschina.net/u/2340880/blog/542221?fromerr=fpdpdLP ...

  2. iOS App添加扩展App Extension

    主要参考文章 :  https://www.cnblogs.com/fengmin/p/6118592.html demo地址,里面额外添加了一个分享的扩展 :  https://github.com ...

  3. iOS app添加桌面快捷方式

    场景描述:app针对某一功能或者新闻频道,向手机桌面添加一个快捷方式 解决思路: 1.需要一个可以展示的网页,跳转到Safari 2.利用Safari的"添加到主屏幕"的方法,向手 ...

  4. 如何在ios app 局域网内搜索到设备

    现在很多智能家居的app都具有自动扫瞄关联设备的功能,在网上搜索了一下,了解到是通过udp的广播技术来实现的. 然后在网上查找了一些资料后,自己也使用两个app模拟了一下通信过程:其中一个app模拟设 ...

  5. 给IOS APP 添加启动页步骤

    添加启动页比较简单,这里只是记录一下,两个步骤就可以了: 添加图片到Assets中,这里命名为:LaunchImg 点开LaunchScreen.storyboard 拖动一个UIImageView到 ...

  6. 21个高质量的Swift开源iOS App

    原文:21 Amazing Open Source iOS Apps Written in Swift 对Swift初学者来说,学习开源项目,阅读源码是个不错的方法.在这篇文章中,基于对代码质量和排名 ...

  7. iOS传感器开发——为APP添加手机密码、指纹进行安全验证

    iOS传感器开发--为APP添加手机密码.指纹进行安全验证 一.引言 iPhone5s之后,iPhone硬件上已支持进行指纹识别的功能,相应的,一些新的api也可以应用于APP中,进行用户安全的验证. ...

  8. php图片涂鸦,IOS_详解iOS App中图片的线段涂鸦功能的添加方法,接下来我们要讲图片的涂鸦, - phpStudy...

    详解iOS App中图片的线段涂鸦功能的添加方法 接下来我们要讲图片的涂鸦,我们分开一点一点拓展,先给图片上划线 创建项目 起名testAddLine 接下来我们在默认生成的ViewControlle ...

  9. iOS app 实现热更新(无需发新版本实现app添加新功能)

    打包上传太费劲 目前能够实现热更新的方法,总结起来有以下三种 使用FaceBook 的开源框架 reactive native,使用js写原生的ios应用 ios app可以在运行时从服务器拉取最新的 ...

  10. 【如何给iOS APP加固】之代码混淆及加密 第一章【附代码】

    为了给iOS app加固,我们可以采取以下几种方式: 1.代码混淆 代码混淆是通过修改源代码结构和变量名,使得代码难以被理解和反编译.这可以防止黑客获取应用程序的代码,因为即使他们能够获得源代码,也会 ...

最新文章

  1. Java项目:房屋租赁管理系统(java+SSM+Layui+Maven+Mysql+Jsp)
  2. (C++)输入输出字符矩阵(二维字符数组)的三种方法
  3. mongodb jar包_MongoDB是什么?看完你就知道了!
  4. C++设计模式之适配器模式
  5. codebrag审核代码工具安装配置
  6. 怎么看linux电脑是不是双核,Linux系统如何判断CPU是双核还是单核
  7. python 程序停止打印日志_优雅停止 SpringBoot 服务,拒绝 kill -9 暴力停止!
  8. 配置独立于系统的PYTHON环境
  9. 这个省3月23日开始错时错峰开学,在校不要求戴口罩!
  10. Discuz! 7.1 7.2 远程代码执行漏洞
  11. .net core 中 Identity Server 4 Topic 之 Startup
  12. excel字符串截取处理方法
  13. 手把手教你做短视频去水印微信小程序(5-服务端代码)
  14. python校园排课选课系统毕业设计开题报告
  15. Python升级pip失败解决办法
  16. Shell Bad substitution的解决方法
  17. wsl2下安装lammps
  18. 谈谈市面上无线路由器的性能和芯片
  19. 服务器维修工程师面试,设备维修工程师面试内容有哪些?
  20. ubuntu升级到8.10后Realplayer11不能播放的问题

热门文章

  1. android+状态栏显示图标大全,状态栏中的Android显示图标
  2. HDRP shader 获取阴影(Custom Pass)
  3. STM32F103_study49_The punctual atoms(STM32 Bit operation and logical operation in C language )
  4. linux 根目录变为只读了,Linux系统重启或无故变为只读造成网站无法正常访问的简单临时的做 根目录只读不能写处理:...
  5. 【Python+Selenium】输入关键词自动下载论文
  6. Ubuntu VirtualBox 安装问题解决
  7. Efficientnet网络详解及构建
  8. 齐向东:云计算时代的网络安全更重要
  9. np.digitize 用法详解
  10. android wear自动断开,如果你的手表总是自动断开与手机连接的话,可以看下。