阅读更多

0顶
0踩

移动开发
iOS9 Day-by-Day是作者Chris Grant新开的一个系列博客,覆盖了iOS开发者必须知道的关于iOS 9的新技术与API,并且还进行了实际操作演练,每篇文章中相关的代码Chris都会将其托管到GitHub。

在第一篇文章中,Chris介绍了iOS 9的三种搜索API,分别为:
1.NSUserActivity,索引用户活动以及App的状态。
2.iOS 9新增的CoreSpotlight.framework提供了增、删、改、查等搜索API,可以索引App的内容。
3.Web Markup,Web内容可被搜索。
译文如下:

在苹果发布iOS 9之前,你只能在Spotlight中输入名称来寻找App,而随着苹果发布了一套全新的iOS 9 Search APIs之后,开发者不但可以自由选择App的部分内容编入索引,还能对Spotlight上的搜索结果以及点击不同结果显示的内容进行设置。

三大API

NSUserActivity

NSUserActivity是iOS 8专为Handoff推出的API,iOS 9之后得到了提升。现在用户只需提供元数据(metadata)就能搜索不同的activity(活动)了。换言之,Spotlight可以将activity编入索引,而NSUserActivity就好比网页浏览器的历史堆栈(history stack),使用户能在Spotlight上搜到最近的活动。

Web Markup

Web Markup在网页上显示App的内容并编入Spotlight索引,如此一来即便没有安装某个App,苹果的索引器也能在网页上搜索特别的标记(markup),在Safari或Spotlight上显示搜索结果。

显示未安装App的搜索结果是一大亮点,有望为开发者带来更多潜在用户。公布在搜索API上的App深链接则储存在苹果的cloud index中。更多详情,请参阅苹果的“Web Markup使用指南(Use Web Markup to Make App Content Searchable)”。

CoreSpotlight

NSUserActivity帮助储存用户历史,而全新的Core Spotlight则能将App中的任何内容编入索引,实质是在用户设备上提供基础的Core Spotlight索引渠道,满足用户另外一个需求。

实战

使用Core Spotlight API

NSUserActivity和Web Markup比较简单,而Core Spotlight就有点复杂了。为帮助读者更好地理解CoreSpotlight的作用,我们创建了一个简易的好友清单App,点击不同的好友名称,就会显示对应的照片。读者可以在GitHub上找到代码,跟我们一起实践一下吧。



App中简单列出了一个故事板,FriendTableViewController显示好友的名字,FriendViewController则显示好友的详细信息。



好友信息都储存在Datasource类的模型里,其中包含将相关信息存入CoreSpotlight索引的逻辑。

先重写Datasource类中的init()方法,在Datasource类里创建和储存一队列Person对象。其实从数据库或服务器上加载真实数据也行,但方便理解,我们直接创建一些虚拟数据。
override init () {
    let becky = Person()
    becky.name = "Becky"
    becky.id = "1"
    becky.image = UIImage(named: "becky")!

    ...

    people = [becky, ben, jane, pete, ray, tom]
}

数据在一队列people中储存好之后,就可以用Datasource了!

现在数据准备好了,FriendTableViewController可以创建一个Datasource的实例来响应表格视图显示储存格的请求。
let datasource = Datasource()  

cellForRowAtIndexPath显示在储存格里的内容可以很简单,比如:
let person = datasource.people[indexPath.row]
cell?.textLabel?.text = person.name

将好友信息存入CoreSpotlight

我们可以用新的iOS9 API将好友信息存入CoreSpotlight。在Datasource 类里已经定义了savePeopleToIndex的功能,视图加载好后FriendTableViewController 就会调用该功能。

我们在队列里循环访问不同好友的信息,为每个人创建一个CSSearchableItem,然后储存到名为searchableItems的暂存阵列里。
let attributeSet = CSSearchableItemAttributeSet(itemContentType: "image" as String)
attributeSet.title = person.name
attributeSet.contentDescription = "This is an entry all about the interesting person called (person.name)"
attributeSet.thumbnailData = UIImagePNGRepresentation(person.image)
let item = CSSearchableItem(uniqueIdentifier: person.id, domainIdentifier: 
    "com.ios9daybyday.SearchAPIs.people", attributeSet: attributeSet)
searchableItems.append(item)

最后一步是在系统默认的CSSearchableIndex上调用indexSearchableItems ,作用是将信息一项一项存入CoreSpotlight,以便用户搜索,显示搜索结果。
CSSearchableIndex.defaultSearchableIndex().indexSearchableItems(searchableItems, 
                   completionHandler: { error -> Void in
    if error != nil {
        print(error?.localizedDescription)
    }
})

大功告成!现在运行App时就会储存数据了。在Spotlight中能够搜到好友们的信息啦!



用户选择

Spotlight能显示搜索结果了,那么点击不同好友会怎样呢?——其实只是打开App的主屏幕而已。要想直接显示对应的好友信息,还需要做更多。我们通过AppDelegate的continueUserActivity UIApplicationDelegate方法添加这个功能。

以下是该方法完整的执行过程:
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
    // Find the ID from the user info
    let friendID = userActivity.userInfo?["kCSSearchableItemActivityIdentifier"] as! String

    // Find the root table view controller and make it show the friend with this ID
    let navigationController = (window?.rootViewController as! UINavigationController)
    navigationController.popToRootViewControllerAnimated(false)
    let friendTableViewController = navigationController.viewControllers.first as! FriendTableViewController
    friendTableViewController.showFriend(friendID)

    return true
}

好了,之前用indexSearchableItems功能存入CoreSportlight索引的信息显示在userActivity.userInfo目录里了。我们所关心的好友ID一项一项通过kCSSearchableItemActivityIdentifier储存在索引里了。

从userInfo目录提取信息时,可以找到App的导航控制器,回归到root(由于没有动画提示,用户可能注意不到),然后在friendTableViewController上调用showFriend 功能。具体细节不多说,这个过程实际上是在数据源里找到好友的ID信息,然后给导航控制器堆栈推送新的视图控制器就可以了!现在点击Spotlight的好友信息,就会看到如下内容:



看到了吧?App屏幕左上方角落里有“Back to Search(返回搜索)”选项,直接返回到显示好友名称的搜索屏。也可以用“back(返回)”键完成这一步。

Demo总结

我们刚刚了解了如何整合App数据跟CoreSpotlight索引,过程很简单——简化了打开App的操作,搜索特定内容也更方便了。

此文没有提及如何从索引中删除数据。为保持更新app所用的索引,CoreSpotlight的删除功能必不可少,这方面可以看看deleteSearchableItemsWithIdentifiers,deleteSearchableItemsWithDomainIdentifiers和deleteAllSearchableItemsWithCompletionHandler三个功能。

做iOS生态系统的“良民”

对开发者而言,在Spotlight和Safari上的曝光率自然是越高越好,但信息泛滥可能导致不良后果,所以奉劝各位三思。在iOS生态系统中努力做“良民”能在用户心里留下好印象,另外也不会给苹果公司留下把柄,他们在关联数据上投下重金,由于数据相关性收到严密监控,若出现数据泛滥的情况,就会被移到搜索结果的底部。

更多信息

若想了解iOS9搜索API的更多信息,推荐观看WWDC 709会议对搜索API的介绍(Introducing Search APIs),另外NSUserActivity Class Reference以及documentation for CoreSpotlight也是很不错的参考资料。若想亲自体验上述的小实验,可以在GitHub上找到源码。
(翻译/张新慧 审校/唐小引)


文章来源:shinobicontrols
  • 大小: 25.6 KB
  • 大小: 8.9 KB
  • 大小: 49.1 KB
  • 大小: 27.6 KB
0
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 微信跳转方法

    一个官方,一个自己写的 第二个index.php 自己看一下就明白了

  • 微信计数器|微信自动加好友|微信自动通过好友|微信HOOK|微信静默清粉

    了解了微信吸粉等相关行业,其中有个需求就是计数器,原理是通过HOOK指定CALL,从中调用计数平台API来实现此功能。当然普遍收费的计数器都是要自己搭建服务器的,此软件目前仅在本地测试。 全套微信HOOK教程地址:https://www.bilibili.com/video/BV1it411F7w8?p=18 这是微信通讯的XML <msg fromusername="wxid_0ojxufnztgnr22" encryptusername="v3_020b3826fd

  • 微信协议 搜索手机号返回数据接口 检测手机号接口

    我们搜索手机的时候 其实可以通过协议返回一些用户的数据 微信的数据还是很准确的 很适合做检测 其中sex 参数种 0未知 1男 2女 V3 v4 数据用于添加好友接口 http://{{localhost}}/contact/SearchContact { "code": 0, "MSG": "操作成功!", "data": { "msg": "success", "result": { "data": { "TX": {

  • 实战iOS9:剖析UIKitDynamics的改进

    摘要:iOS9Day-by-Day是作者ChrisGrant写的系列博客,覆盖了iOS开发者必须知道的关于iOS9的新技术与API,并且还进行了实际操作演练。本文为第9篇,详细介绍了iOS9中,UIKitDynamics的一些改进。iOS9Day-by-Day是作者...

  • 实战iOS9【第一天】搜索API

    随着iOS9新的搜索API的公布,Apple现在允许开发者来选择应用中想要索引的内容,还有结果在Spotlight中展示的方式,以及当用户点击一个结果时发生什么。   三个API NSUserActivity NSUserActivity API...

  • 实战iOS 9:剖析UIKit Dynamics的改进

    iOS9 Day-by-Day是作者Chris Grant写的系列博客,覆盖了iOS开发者必须知道的关于iOS 9的新技术与API,并且还进行了实际操作演练,每篇文章中相关的代码Chris都会将其上传至GitHub上。在Search APIs、UI Testing、...

  • iOS开发者专题(包含文档和DEMO源码)

    01.成为iOS开发者 02.第一个iOS应用 03.了解iOS内存管理 04.解析ARC原理 05.delegate模式 06.可扩展的服务端API 07.主流开发框架介绍 08.构建完整应用——架构篇 09.构建完整应用——编码篇 10.如何提交AppStore审核...

  • iOS开发:ReactiveCocoa+MVVM(UITableView)实战

    ReactiveCocoa发展之际可能刚好遇到swift横空出世,导致RAC在OC还没有完全普及,大量开发者就转向swift以及RxSwift了。目前网上搜索RAC的文章都是几年前的,而RxSwift则都是最新的文章。这里在此立个flag,要开始...

  • iOS开发者必备:iOS、mac开源项目及库

     - 一个简易的alertview 有三种样式,有成功,失败,和警告三种样式,支持Delegate和block两种回调。  MJPopupViewController  - 实现弹出视图的各种弹出和消失效果,包括淡入淡出(fade in,fade out)...

  • ios8新特性:pushkit实战总结(voip开发者必读)

    Question:pushkit是什么?...Answer:ios8苹果新引入了名为pushkit的框架和一种新的push通知类型,被称作voip push.该push方式旨在提供区别于普通apns push的能力,通过这种push方式可以使app执行制定的代码(在

  • 1、DRF实战总结:DRF特点、序列化与RESTful API规范

    Django这种基于MVC开发模式...由于客户端的开发语言与后台的开发语言经常不一样,这时需要后台能够提供可以跨平台跨语言的一种标准的资源或数据(如json或xml)供前后端沟通,这就是Web API(网络应用程序接口)的作用了。

  • 视频教程-iOS项目实战视频课程:PM2.5实时查询App-iOS

    iOS项目实战视频课程:PM2.5实时查询App 东北大学计算机专业硕士研究...

  • 开发者福利!Twitter 推出开源 iOS 文本编辑器 API

    Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲技术编辑:宗恩丨发自 思否编辑部近日,Twitter...

  • 降本增效工具系列(二):IOS 系统 Crash 日志分析实战

    当应用程序在IOS设备上崩溃(例如,闪退)时,一份“Crash崩溃报告”将在该设备上创建并存储起来。崩溃报告描述了应用程序是在何种条件下崩溃的,大部分情况下包含一份当前正在运行线程的完整堆栈跟踪。如果设备就在...

  • App项目实战之路(二):API篇

    App项目实战之路(二):API篇 App项目实战之路(三):原型篇 App项目实战之路(四):UI篇 App项目实战之路(五):服务端篇 App项目实战之路(六):数据库篇确定功能需求概述篇发布出去后,收到很多人的大力支持,也收到了...

  • Jetson Nano 从入门到实战(案例:Opencv配置、人脸检测、二维码检测)

    另一种就是使用接口8,此时需要对J48进行短接,短接完成后就可以切换成接口8进行电源输入,如下图所示: 接口9: MIPI CSI 摄像头,可以直接购买用于树莓派的摄像头即可使用; 除了裸机以外,还需自行购买内存卡、...

  • iOS中高级开发者面试必过技巧分析

    本文就是笔者认为可以用来面试高级 iOS 程序员的面试题。这套题的题目跟公司和业务都没有关系,而且也并不代表本人可以把这些题回答得非常好,只是将一部分觉得比较好的题从收集的面试题里面抽出来了而已。 如果...

  • iOS开发者必备:自己总结的iOS、mac开源项目及库

    登录 | 注册 Mackerelz的博客 ...2016软考项目经理实战班 学院周年礼-顶尖课程钜惠呈现 有奖征文:在云上开发的无限可能  【博客专家】有奖试读—Windows PowerShell实战指南 关闭

  • 今天编程挺顺利,搞懂了xmlhttp的不刷新技术

    select二级的关联一直困扰着我,怎么实现不刷新地读取数据库呢 看了微软相关xmlhttp的文档和参考了csdn文档http://dev.csdn.net/develop/article/28/28324.shtm后 收获巨大!通过使用xmlhttp+jsp后,以后就可以不刷新地读取数据库了.............. 心情十分舒畅!   以后的路还是这么顺利就好了

Global site tag (gtag.js) - Google Analytics