Xamarin.iOS で NSUserActivity を使用して検索する
NSUserActivity
は iOS 8 で導入され、ハンドオフ用のデータを提供するために使用されています。
これにより、アプリの特定の部分にアクティビティを作成し、別の iOS デバイスで実行されているアプリの別のインスタンスに渡すことができます。 受信側のデバイスは、前のデバイスで開始されたアクティビティを続行し、ユーザーが中断したところから再開できます。 Handoff の使用方法の詳細については、Handoff の概要に関するドキュメントを参照してください。
iOS 9 の新機能では、NSUserActivity
にインデックスを付け (公開と非公開の両方)、Spotlight 検索と Safari から検索できます。 NSUserActivity
を検索可能としてマークし、インデックス付けできるメタデータを追加することで、iOS デバイスの検索結果にアクティビティを一覧表示できます。
ユーザーがアプリからアクティビティに属する検索結果を選択すると、アプリが起動され、NSUserActivity
によって記述されたアクティビティが再起動され、ユーザーに表示されます。
NSUserActivity
の以下のプロパティは、App Search をサポートするために使用されます:
EligibleForHandoff
–true
の場合、このアクティビティをハンドオフ操作で使用できます。EligibleForSearch
–true
の場合、このアクティビティはデバイス上のインデックスに追加され、検索結果に表示されます。EligibleForPublicIndexing
–true
の場合、アクティビティが Apple のクラウド ベース インデックスに追加され、まだ iOS デバイスにアプリをインストールしていないユーザー (検索経由) に表示されます。 詳細については、後述の「公開検索インデックス作成」セクションをご覧ください。Title
– アクティビティのタイトルを提供し、検索結果に表示されます。 ユーザーは、タイトルのテキストそのものを検索することもできます。Keywords
– エンド ユーザーによってインデックス化され検索可能になる活動を記述するために使用される、文字列の配列です。ContentAttributeSet
– アクティビティをさらに詳しく説明し、検索結果に豊富なコンテンツを提供するために使用されるCSSearchableItemAttributeSet
です。ExpirationDate
– アクティビティを特定の日付までしか表示しない場合は、ここでその日付を指定できます。WebpageURL
– アクティビティを Web で表示できる場合、またはアプリが Safari のディープ リンクをサポートしている場合は、リンクを設定してここにアクセスできます。
アプリに検索可能な NSUserActivity
を実装するには、次の手順に従います。
NSUserActivity
を使用してコンテンツを検索できるようにすることには、追加の利点がいくつかあります。
検索アクティビティを作成する前に、アクティビティの種類識別子を作成して識別する必要があります。 アクティビティの種類識別子は、特定のユーザー アクティビティの種類を一意に識別するために使用される、アプリの Info.plist ファイルの NSUserActivityTypes
配列に追加される短い文字列です。 配列には、アプリがサポートし、App Search に公開するアクティビティごとに 1 つのエントリが存在します。
Apple では、競合を回避するために、アクティビティの種類識別子に逆引き DNS スタイルの表記を使用することを勧めています。 例えば、特定のアプリ ベースのアクティビティには com.company-name.appname.activity
、複数のアプリにまたがって実行できるアクティビティには com.company-name.activity
を指定します。
アクティビティの種類識別子は、アクティビティの種類を識別するために NSUserActivity
インスタンスを作成するときに使用されます。 ユーザーが検索結果をタップした結果、アクティビティが継続された場合、アクティビティの種類 (とアプリのチームID) により、アクティビティを継続するために起動するアプリが決まります。
この動作をサポートするのに必要なアクティビティの種類識別子を作成するには、Info.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();
NSUserActivity
の ContentAttributeSet
プロパティを次のように設定することで、さらに詳細を追加できます。
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 では、コンテンツや機能をまだ検出していないユーザー (またはアプリをインストールしていないユーザー) も検索でそれらの結果を取得できます。
公開インデックスの仕組みは次の通りです:
- アプリのアクティビティを作成する際、それを "公開" としてマークできます。
- 公開アクティビティは Apple に送信され、クラウドでインデックスが作成されます。
- デバイスでアプリを操作し、アクティビティに代表される特定の機能またはコンテンツを使用するユーザーが増えるにつれて、ランクが上がります。
- 人気のある公開の結果は、アプリをインストールしていない他のユーザーも見ることができます。
- これらの公開の結果は、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 の公開クラウド インデックスに自動的に追加されるわけではありません。 それにはまず次の条件を満たす必要があります。
- 検索結果に表示され、多くのユーザーが選択する必要があります。 アクティビティ エンゲージメントのしきい値が満たされるまで、結果は非公開のままです。
- アプリのプロビジョニングにより、ユーザー固有のデータがインデックス付けされ、公開されるのを防ぐことができます。
アプリで NSUserActivity
経由で App Search を採用すると、次の機能も利用できます。
- ハンドオフ - App Search では、ハンドオフ (
NSUserActivity
) と同じメカニズムを使用してコンテンツ、ナビゲーション、または機能が公開されているため、アプリのユーザーが 1 つのデバイスでアクティビティを開始し、別のデバイスで続行することを簡単に許可できます。 - Siri からの提案 - "Siri からの提案" が通常行う標準的な提案と共に、アプリからのアクティビティを自動的に提案できます。
- Siri スマート リマインダー - ユーザーはSiri に、アプリからのアクティビティについてリマインドするよう頼むことができます。