在 Xamarin.iOS 中使用 NSUserActivity 进行搜索

NSUserActivity 是在 iOS 8 中引入的,用于提供移交项的数据。 它允许你在应用的特定部分创建活动,然后将其移交给不同 iOS 设备上运行的应用的另一个实例。 然后,接收设备可以继续执行在前一个设备上开始的活动,从用户中断的位置继续。 有关使用接力的详细信息,请参阅我们的接力简介文档。

NSUserActivity 是 iOS 9 中的新功能,可为其编制索引(以公开和私密方式),并通过 Spotlight 搜索和 Safari 对其进行搜索。 通过将 NSUserActivity 标记为可搜索并添加可编制索引的元数据,可将活动列在 iOS 设备上的搜索结果中。

应用历史记录概述

如果用户从应用中选择属于某个活动的搜索结果,则会启动该应用,同时重启 NSUserActivity 描述的活动并将其呈现给用户。

NSUserActivity 的以下属性用于支持应用搜索:

  • EligibleForHandoff – 如果为 true,则此活动可用于移交操作。
  • EligibleForSearch – 如果为 true,则此活动将添加到设备上的索引并在搜索结果中呈现。
  • EligibleForPublicIndexing – 如果为 true,则此活动将添加到 Apple 基于云的索引中,并呈现给尚未在其 iOS 设备上安装你的应用的用户(通过搜索)。 有关详细信息,请参阅下面的公共搜索索引编制部分。
  • Title – 提供活动标题并显示在搜索结果中。 用户也可以搜索标题本身的文本。
  • Keywords – 是一个用于描述活动的字符串数组,最终用户将为其编制索引并使其可供搜索。
  • ContentAttributeSet – 是一个 CSSearchableItemAttributeSet,用于进一步详细描述活动,并在搜索结果中提供丰富的内容。
  • ExpirationDate – 如果你希望仅显示指定日期之前的活动,可在此处提供该日期。
  • WebpageURL – 如果可以在 Web 上查看活动或者你的应用支持 Safari 的深层链接,则你可以设置该链接以在此处访问。

NSUserActivity 快速入门

请按照以下说明在应用中实现可搜索的 NSUserActivity

通过 NSUserActivity 使内容可供搜索还能获得一些额外的好处

创建活动类型标识符

在创建搜索活动之前,需要创建一个活动类型标识符来标识它。 活动类型标识符是添加到应用的 Info.plist 文件的 NSUserActivityTypes 数组中的一个短字符串,用于唯一识别给定的用户活动类型。 对于应用支持并向应用搜索公开的每个活动,数组中都会有一个条目。

Apple 建议对活动类型标识符使用反向 DNS 样式表示法以避免冲突。 例如:com.company-name.appname.activity 表示基于特定应用的活动,com.company-name.activity 表示可以跨多个应用运行的活动。

创建 NSUserActivity 实例时使用活动类型标识符来标识活动类型。 当由于用户点击搜索结果而继续执行某个活动时,活动类型(以及应用的团队 ID)将确定启动哪个应用来继续执行该活动。

若要创建支持此行为所需的活动类型标识符,请编辑 Info.plist 文件并切换到“源”视图。 添加 NSUserActivityTypes 键并按以下格式创建标识符:

plist 编辑器中的 NSUserActivityTypes 键和所需标识符

在上面的示例中,我们为搜索活动 (com.xamarin.platform) 创建了一个新的活动类型标识符。 创建你自己的应用时,请将 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 采用应用搜索还可以获得以下功能:

  • 移交 - 由于应用搜索使用与移交相同的机制 (NSUserActivity) 来公开内容、导航和/或功能,因此你可以轻松允许应用用户在一台设备上启动一项活动,并在另一台设备上继续执行该活动。
  • Siri 建议 - 除了 Siri 建议通常提出的标准建议外,还可以自动建议应用中的活动
  • Siri 智能提醒 - 用户可以请求 Siri 就应用中的活动向他们发出提醒