[iOS 10] [Core Spotlight] Spotlight 検索の検索クエリをアプリで受け取る

2016.11.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

iOS 10 から Spotlight 検索をアプリで引き継げるようになりました

iOS 10 の新機能の1つに「Spotlight 検索をアプリで引き継ぐ」というものがあります。

iOS 8 から Spotlight 検索結果にアプリ内コンテンツを表示できるようになりましたが、iOS 10 からは検索しているクエリをアプリで受け取ることができます。

本記事では、Spotlight 検索の検索クエリをアプリで受け取るサンプルを実装してみたいと思います。

Core Spotlight を使ったサンプル

Core Spotlight の簡単なサンプルアプリは、以前ご紹介しました。

[iOS 10] [Core Spotlight] CSSearchQuery でインデックス済みのコンテンツを検索する

本記事では上記のサンプルアプリをベースに実装します。つまり、CSSearchableItem が既に複数件登録されている状態を前提とします。

Info.plist への設定の追加

まず、Info.plist に新しい設定を追加します。CoreSpotlightContinuationYES で登録します。

core-spotlight-continuing-01

application(_:continue:restorationHandler:) の実装

次に AppDelegate クラスに application(_:continue:restorationHandler:) メソッドを実装します。NSUserActivity が引数として渡されるので、ここから直前の Spotlight 検索の情報を得ることができます。userInfo プロパティの中にある CSSearchQueryString というキーの値に、検索クエリ文字列が入っています。

import UIKit
import CoreSpotlight

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
        print("User Activity Type: \(userActivity.activityType)")
        if userActivity.activityType == CSQueryContinuationActionType {
            print("Spotlightから来たよ")
            if let searchQuery = userActivity.userInfo?[CSSearchQueryString] as? String {
                print("「\(searchQuery)」で検索してたよ")
            }
            return true
        }
        return false
    }

}

本記事では、とりあえず検索クエリを取得するところまで実装しています。

実行してみる

まずは、アプリを実行し、こちらの方法と同様にコンテンツをインデックスに追加します。

Spotlight を開き、例えば「ペン」と入力すると、コンテンツが出てきます。その右上に「Search in App」と表示されるようになりました。

core-spotlight-continuing-02

タップするとアプリに遷移します。コンソールにログが出力され、検索クエリが取得できていることが確認できます。

core-spotlight-continuing-03

まとめ

Spotlight 検索への対応は、ユーザーをアプリに引き込む動線としてかなり有効です。また「もっと知りたい!」「もっと調べたい!」といった、痒いところに手が届く機能を提供することができます。

すでにアプリ内にコンテンツを検索するような画面を実装しているのであれば、導入は簡単だと思います。検討してみてはいかがでしょうか。

参考