Xamarin.iOS で Core Spotlight を使用して検索を行う

Core Spotlight は、アプリ内のコンテンツへのリンクの追加、編集、削除を行うためのデータベースライクな API を提供する iOS 9 用の新しいフレームワークです。 Core Spotlight を使用して追加されたアイテムは、iOS デバイス上の Spotlight 検索で利用できます。

Core Spotlight を使用してインデックスを作成できるコンテンツの種類の例については、Apple のメッセージ、メール、カレンダー、メモ アプリを参照してください。 現在、これらはすべて Core Spotlight を使用して検索結果を提供しています。

アイテムの作成

次に示すのは、Core Spotlight を使用してアイテムを作成し、そのインデックスを作成する例です。

using CoreSpotlight;
...

// Create attributes to describe an item
var attributes = new CSSearchableItemAttributeSet();
attributes.Title = "App Center Test";
attributes.ContentDescription = "Automatically test your app on 1,000 devices in the cloud.";

// Create item
var item = new CSSearchableItem ("1", "products", attributes);

// Index item
CSSearchableIndex.DefaultSearchableIndex.Index (new CSSearchableItem[]{ item }, (error) => {
    // Successful?
    if (error !=null) {
        Console.WriteLine(error.LocalizedDescription);
    }
});

この情報は、検索結果に次のように表示されることになります。

主要なスポットライト検索結果の概要

アイテムの復元

ユーザーがアプリの Core Spotlight 経由で検索結果に追加されたアイテムをタップすると、AppDelegate メソッド ContinueUserActivity が呼び出されます (このメソッドは NSUserActivity に対しても使用されます)。 次に例を示します。

public override bool ContinueUserActivity (UIApplication application,
   NSUserActivity userActivity, UIApplicationRestorationHandler completionHandler)
{

    // Take action based on the activity type
    switch (userActivity.ActivityType) {
    case "com.xamarin.platform":
        // Restore the state of the app here...
        break;
    default:
        if (userActivity.ActivityType == CSSearchableItem.ActionType.ToString ()) {
            // Display content for searchable item...
        }
        break;
    }

    return true;
}

今回は、CSSearchableItem.ActionTypeActivityType を持つアクティビティを確認していることに注意してください。

アイテムの更新

タイトルやサムネイル画像の変更が必要な場合など、Core Spotlight を使用して作成したインデックス アイテムを変更する必要がある場合があります。 この変更を行うには、最初にインデックスを作成するために使用されたものと同じメソッドを使用します。 以下のように、そのアイテムを作成するのに使用されたのと同じ ID を使用して新しい CSSearchableItem を作成し、変更された属性を含む新しい CSSearchableItemAttributeSet をアタッチします。

項目の更新の概要

このアイテムが検索可能なインデックスに書き込まれると、既存のアイテムは新しい情報で更新されます。

アイテムの削除

Core Spotlight には、インデックス アイテムが不要になったときに、それを削除する方法が複数用意されています。

まず、次に例を示すように識別子でアイテムを削除できます。

// Delete Items by ID
CSSearchableIndex.DefaultSearchableIndex.Delete(new string[]{"1","16"},(error) => {
    // Successful?
    if (error !=null) {
        Console.WriteLine(error.LocalizedDescription);
    }
});

次に、ドメイン名でインデックス アイテムのグループを削除できます。 次に例を示します。

// Delete by Domain Name
CSSearchableIndex.DefaultSearchableIndex.DeleteWithDomain(new string[]{"domain-name"},(error) => {
    // Successful?
    if (error !=null) {
        Console.WriteLine(error.LocalizedDescription);
    }
});

最後に、次のコードを使用して、すべてのインデックス アイテムを削除できます。

// Delete all index items
CSSearchableIndex.DefaultSearchableIndex.DeleteAll((error) => {
    // Successful?
    if (error !=null) {
        Console.WriteLine(error.LocalizedDescription);
    }
});

その他の Core Spotlight 機能

Core Spotlight には、インデックスを正確かつ最新の状態に保つために役立つ以下の機能があります。

  • バッチ更新サポート – アプリでインデックスの大規模なグループを同時に作成または変更する必要がある場合は、バッチ全体を 1 回の呼び出しで CSSearchableIndex クラスの Index メソッドに送信できます。
  • インデックスの変更への対応CSSearchableIndexDelegate を使用すると、アプリは検索可能なインデックスからの変更と通知に対応できます。
  • データ保護の適用 – データ保護クラスを使用して、Core Spotlight を使用して検索可能なインデックスに追加するアイテムにセキュリティを実装できます。