你需要了解的 Core Spotlight

你需要了解的 Core Spotlight

--

了解Spotlight

Core Spotlight是iOS 9中苹果推出了新的Search API,可以直接搜App内的内容(in-App Search),这样用户更容易找到他们想要的内容,哪怕这个内容是在某个 App 内部的,从而大大提高 App 的使用度和曝光度。

项目的下载地址:SpotlightDemo项目地址

项目完工的🌰:

使用Spotlight

1 - 导入Framework

MobileCoreServices.framework, CoreSpotlight.framework

在使用类中导入以下的文件

import CoreSpotlight

import MobileCoreServices

2 - 开始使用
2.1 - CSSearchableItemAttributeSet

我们先通过CSSearchableItemAttributeSet开始

        //用kUTTypeImage 或者 kUTTypeText 没啥影响
    let attr = CSSearchableItemAttributeSet(itemContentType: kUTTypeImage as String)
    //标题
    attr.title = "上海"
    //搜索关键字
    attr.keywords = ["金融","shanghai","魔都"]
    //描述信息,可以显示在搜索结果里
    attr.contentDescription = "上海港货物吞吐量和集装箱吞吐量均居世界第一,是一个良好的滨江滨海国际性港口"
    //搜索的图片
    let defalutImgae = UIImage(named:"gankoo01")
    attr.thumbnailData = UIImagePNGRepresentation(defalutImgae!)

上面这段代码完成了 attributeSet 的创建。 它的构造方法接受一个 itemContentType 参数,这个表示我们要创建的搜索项所对应的数据类型,我们这里使用的是kUTTypeText,它表示文本数据。

2.2 - CSSearchableItem

有了这些信息,我们就可以创建 CSSearchableItem 了:

SSearchableItem 接受 3 个参数,第一个就是 uniqueIdentifier,接下来是 domainIdentifier,最后是我们刚刚创建的attributeSet。这里如果要设置多个可以检索的项目uniqueIdentifier和domainIdentifier必须都不相同,否则无法搜索到。

let sm = CSSearchableItem(uniqueIdentifier: "identifier_001", domainIdentifier: "domainIdentifier_001", attributeSet: attr)
2.3 - CSSearchableIndex

创建后搜索项后,我们还要做最后一步操作,就是把它注册到 Spotlight 的搜索系统中:

 CSSearchableIndex.default().indexSearchableItems([sm,sm2], completionHandler: { error in
        if error != nil{
            print("创建Spotlight索引失败:\(error?.localizedDescription)")
        }
    })

到此为止,Core Spotlight 的注册过程就完成了。如果你把上面的代码放到你的 App 工程中,然后运行程序,就可以在 Spotlight 搜索框中搜索到自己 App 的内容了。

处理 Spotlight 调起

Spotlight 的注册工作完成了,如果没有什么异常情况,你应该可以在搜索结果中看到自己的应用内容了。现在我们开始处理点击搜索结果项后的调起操作,我们在AppDelegate中添加系统的回调方法:

//通过Spotlight进入APP
func application(_ application: UIApplication, willContinueUserActivityWithType userActivityType: String) -> Bool {

    if userActivity?.activityType == CSSearchableItemActionType {
        //            let idetifier = (userActivity?.userInfo?[CSSearchableItemActivityIdentifier] as? String) !
        guard let idfier = userActivity?.userInfo?[CSSearchableItemActivityIdentifier] as? String else {
            return false
        }

        if idfier == "gankoo" {
            print(userActivity?.userInfo ?? "")
        }
    }
    
    return true
}

当我们点击 Spotlight 搜索项的时候, 系统会调用我们 APPDelegate 的 application:continueUserActivity 方法, 这里我们判断 activity 类型。 只有类型为 CSSearchableItemActionType 的才是来自 Spotlight 的跳转。

然后在 userInfo 中,我们可以通过 CSSearchableItemActivityIdentifier 这个 key 来得到相应搜索项的 uniqueIdentifier。 在我们这个例子中,它就是我们要打开文件的路径。 然后调用相应的文件处理方法就完成了

参考:

posted @ 2017-02-13 10:53  Darren.Von  阅读(799)  评论(0编辑  收藏  举报
新浪微博:IT_攻城师,github:darren90(欢迎★star点赞)