Xamarin.iOS で NSUserActivity を使用して検索する

NSUserActivity は iOS 8 で導入され、ハンドオフ用のデータを提供するために使用されています。 これにより、アプリの特定の部分にアクティビティを作成し、別の iOS デバイスで実行されているアプリの別のインスタンスに渡すことができます。 受信側のデバイスは、前のデバイスで開始されたアクティビティを続行し、ユーザーが中断したところから再開できます。 Handoff の使用方法の詳細については、Handoff の概要に関するドキュメントを参照してください。

iOS 9 の新機能では、NSUserActivity にインデックスを付け (公開と非公開の両方)、Spotlight 検索と Safari から検索できます。 NSUserActivity を検索可能としてマークし、インデックス付けできるメタデータを追加することで、iOS デバイスの検索結果にアクティビティを一覧表示できます。

アプリ履歴の概要

ユーザーがアプリからアクティビティに属する検索結果を選択すると、アプリが起動され、NSUserActivity によって記述されたアクティビティが再起動され、ユーザーに表示されます。

NSUserActivity の以下のプロパティは、App Search をサポートするために使用されます:

  • EligibleForHandofftrue の場合、このアクティビティをハンドオフ操作で使用できます。
  • EligibleForSearchtrue の場合、このアクティビティはデバイス上のインデックスに追加され、検索結果に表示されます。
  • EligibleForPublicIndexingtrue の場合、アクティビティが Apple のクラウド ベース インデックスに追加され、まだ iOS デバイスにアプリをインストールしていないユーザー (検索経由) に表示されます。 詳細については、後述の「公開検索インデックス作成」セクションをご覧ください。
  • Title – アクティビティのタイトルを提供し、検索結果に表示されます。 ユーザーは、タイトルのテキストそのものを検索することもできます。
  • Keywords – エンド ユーザーによってインデックス化され検索可能になる活動を記述するために使用される、文字列の配列です。
  • ContentAttributeSet – アクティビティをさらに詳しく説明し、検索結果に豊富なコンテンツを提供するために使用される CSSearchableItemAttributeSet です。
  • ExpirationDate – アクティビティを特定の日付までしか表示しない場合は、ここでその日付を指定できます。
  • WebpageURL – アクティビティを Web で表示できる場合、またはアプリが Safari のディープ リンクをサポートしている場合は、リンクを設定してここにアクセスできます。

NSUserActivity クイックスタート

アプリに検索可能な NSUserActivity を実装するには、次の手順に従います。

NSUserActivity を使用してコンテンツを検索できるようにすることには、追加の利点がいくつかあります。

アクティビティの種類識別子の作成

検索アクティビティを作成する前に、アクティビティの種類識別子を作成して識別する必要があります。 アクティビティの種類識別子は、特定のユーザー アクティビティの種類を一意に識別するために使用される、アプリの Info.plist ファイルの NSUserActivityTypes 配列に追加される短い文字列です。 配列には、アプリがサポートし、App Search に公開するアクティビティごとに 1 つのエントリが存在します。

Apple では、競合を回避するために、アクティビティの種類識別子に逆引き DNS スタイルの表記を使用することを勧めています。 例えば、特定のアプリ ベースのアクティビティには com.company-name.appname.activity、複数のアプリにまたがって実行できるアクティビティには com.company-name.activity を指定します。

アクティビティの種類識別子は、アクティビティの種類を識別するために NSUserActivity インスタンスを作成するときに使用されます。 ユーザーが検索結果をタップした結果、アクティビティが継続された場合、アクティビティの種類 (とアプリのチームID) により、アクティビティを継続するために起動するアプリが決まります。

この動作をサポートするのに必要なアクティビティの種類識別子を作成するには、Info.plist ファイルを編集し、[ソース] ビューに切り替えます。 NSUserActivityTypes キーを追加し、次の形式で識別子を作成します。

plist エディターの NSUserActivityTypes キーと必要な識別子

上記の例では、検索アクティビティ (com.xamarin.platform) 用の新しいアクティビティの種類識別子を 1 つ作成しました。 独自のアプリを作成するときは、 NSUserActivityTypes 配列の内容を、アプリがサポートするアクティビティに固有のアクティビティの種類識別子に置き換えます。

アクティビティの作成

以下は、デバイス上のインデックスをホストとする検索のアクティビティの作成例です:

// Create App Search Activity
var activity = new NSUserActivity ("com.xamarin.platform");

// Define details
var info = new NSMutableDictionary ();
info.Add(new NSString("link"),new NSString("http://xamarin.com/platform"));

// Populate Activity
activity.Title = "The Xamarin Platform";
activity.UserInfo = info;

// Add App Search ability
activity.EligibleForSearch = true;
activity.BecomeCurrent();

NSUserActivityContentAttributeSet プロパティを次のように設定することで、さらに詳細を追加できます。

追加検索の詳細の概要

ContentAttributeSet を使用すると、エンド ユーザーの興味を引き操作につなげる豊富な検索結果を作成できます。

アクティビティへの応答

アプリの検索結果 (NSUserActivity) をタップしたユーザーに応答するには、AppDelegate.cs ファイルを編集し、ContinueUserActivity メソッドをオーバーライドします。 次に例を示します。

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;
    }

    return true;
}

これはハンドオフ要求に応答するために使用されるのと同じメソッド オーバーライドであることに注意してください。 ユーザーが Spotlight 検索結果でアプリからリンクをクリックすると、アプリが前景に移動され (まだ実行されていない場合は開始され)、そのリンクに含まれるコンテンツ、ナビゲーション、または機能が表示されます。

検索から以前の状態を復元する

公開検索のインデックス作成

前出のように、iOS 9 では、ユーザーがすでに検出し、特定の iOS デバイスで使用しているアプリのコンテンツや機能への検索アクセスを簡単に提供できるようになりました。 公開インデックス作成を使用すると、iOS 9 では、コンテンツや機能をまだ検出していないユーザー (またはアプリをインストールしていないユーザー) も検索でそれらの結果を取得できます。

公開インデックスの仕組みは次の通りです:

  1. アプリのアクティビティを作成する際、それを "公開" としてマークできます。
  2. 公開アクティビティは Apple に送信され、クラウドでインデックスが作成されます。
  3. デバイスでアプリを操作し、アクティビティに代表される特定の機能またはコンテンツを使用するユーザーが増えるにつれて、ランクが上がります。
  4. 人気のある公開の結果は、アプリをインストールしていない他のユーザーも見ることができます。
  5. これらの公開の結果は、Spotlight 検索と Safari に表示されます (アクティビティに URL が含まれている場合)。

上記で作成した非公開検索アクティビティを、公開に拡張できます。

// Create App Search Activity
var activity = new NSUserActivity ("com.xamarin.platform");

// Define details
var info = new NSMutableDictionary ();
info.Add(new NSString("link"),new NSString("http://xamarin.com/platform"));

// Populate Activity
activity.Title = "The Xamarin Platform";
activity.UserInfo = info;

// Add App Search ability
activity.EligibleForSearch = true;
activity.EligibleForPublicIndexing = true;
activity.BecomeCurrent();

EligibleForPublicIndexing = true を設定することでアクティビティが公開インデックスに設定されたからといって、そのアクティビティが Apple の公開クラウド インデックスに自動的に追加されるわけではありません。 それにはまず次の条件を満たす必要があります。

  1. 検索結果に表示され、多くのユーザーが選択する必要があります。 アクティビティ エンゲージメントのしきい値が満たされるまで、結果は非公開のままです。
  2. アプリのプロビジョニングにより、ユーザー固有のデータがインデックス付けされ、公開されるのを防ぐことができます。

その他の利点

アプリで NSUserActivity 経由で App Search を採用すると、次の機能も利用できます。

  • ハンドオフ - App Search では、ハンドオフ (NSUserActivity) と同じメカニズムを使用してコンテンツ、ナビゲーション、または機能が公開されているため、アプリのユーザーが 1 つのデバイスでアクティビティを開始し、別のデバイスで続行することを簡単に許可できます。
  • Siri からの提案 - "Siri からの提案" が通常行う標準的な提案と共に、アプリからのアクティビティを自動的に提案できます。
  • Siri スマート リマインダー - ユーザーはSiri に、アプリからのアクティビティについてリマインドするよう頼むことができます。