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

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

iOS 9 を初めて使用する場合は、 NSUserActivity インデックスを作成し (パブリックとプライベートの両方)、Spotlight Search と Safari から検索できます。 検索可能としてマーク NSUserActivity し、インデックス付け可能なメタデータを追加することで、iOS デバイスの検索結果にアクティビティを一覧表示できます。

The App History overview

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

アプリ検索のサポートには、次の NSUserActivity プロパティが使用されます。

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

NSUserActivity クイック スタート

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

コンテンツを検索可能にするために使用NSUserActivityする利点がいくつかあります。

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

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

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

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

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

The NSUserActivityTypes key and required identifiers in the plist editor

上記の例では、検索アクティビティ (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();

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

Addition Search Details overview

これを使用すると、 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 検索結果でアプリからリンクをクリックすると、アプリがフォアグラウンドに移動され (まだ実行されていない場合は開始されます)、そのリンクで表されるコンテンツ、ナビゲーション、または機能が表示されます。

Restore Previous State from Search

パブリック検索のインデックス作成

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

パブリック インデックス作成は、次のように機能します。

  1. アプリのアクティビティを作成するときに、それをパブリックとしてマークできます。
  2. パブリック アクティビティは Apple に送信され、クラウドでインデックスが作成されます。
  3. デバイスでアプリを操作し、アクティビティによって表される特定の機能またはコンテンツを使用するユーザーが増えるにつれて、ランクが上がります。
  4. アプリがインストールされていない場合でも、他のユーザーが一般的な公開結果を利用できます。
  5. これらのパブリックな結果は、Spotlight Search と 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 を採用すると、次の機能も利用できます。

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