Xamarin.iOS 中的“主动建议”简介

本文介绍如何使用 Xamarin.iOS 应用中的“主动建议”让系统主动向用户自动呈现有用的信息,从而提高参与度。

对于 iOS 10,“主动建议”通过在适当的时候主动向用户自动呈现有用的信息,为用户提供了与 Xamarin.iOS 应用互动的新方法。

iOS 10 允许系统在适当的时间主动向用户自动呈现有用的信息,从而提供了提高应用参与度的新方法。 正如 iOS 9 提供了使用聚焦、Handoff 和 Siri 建议向应用添加深度搜索(请参阅新搜索 API)的功能一样,在 iOS 10 中,应用可以公开系统可从以下位置向用户呈现的功能:

  • 应用切换器
  • 锁屏界面
  • CarPlay
  • Maps
  • Siri 交互
  • QuickType 建议

应用使用一系列技术(例如 NSUserActivity、Web 标记、核心聚焦、MapKit、媒体播放器和 UIKit)向系统公开此功能。 此外,通过为应用提供主动建议支持,可以免费获取更深入的 Siri 集成。

基于位置的建议

NSUserActivity 类是 iOS 10 的新功能,它包含一个 MapItem 属性,允许开发人员提供可在其他上下文中使用的位置信息。 例如,如果应用显示餐厅评论,开发人员可以将 MapItem 属性设置为用户在应用中查看的餐厅位置。 如果用户切换到地图应用,则餐厅的位置将自动可用。

如果应用支持应用搜索,则可以使用 CSSearchableItemAttributesSet 类的新地址组件来指定用户可能想要访问的位置。 通过设置 MapItem 属性,其他属性会自动填充。

除了设置地址组件属性的 LatitudeLongitude 外,建议应用也提供 NamedLocationPhoneNumbers 属性,以便 Siri 可以启动对位置的调用。

基于 Web 标记的建议

iOS 9 增加了在网站中包含结构化数据标记的功能,丰富了用户在“聚焦”和 Safari 搜索结果中看到的内容(请参阅使用 Web 标记进行搜索)。 iOS 10 增加了包括基于位置的标记(如 PostalAddress,由 Schema.org 定义)以进一步增强用户体验的功能。 例如,如果用户在网站上查看标有位置的页面,系统可以在用户打开“地图”时建议相同的位置。

基于文本的建议

UIKit 在 iOS 10 中进行了扩展,包括 UITextInputTraits 类的TextContentType 属性,可指定文本区域中内容的语义。 有了此信息,系统通常可以自动选择适当的键盘类型,改进自动更正建议,并主动集成来自其他应用和网站的信息。

例如,如果用户正在标记为 UITextContentType.FullStreetAddress 的文本字段中输入文本,系统可以建议使用用户最近查看的位置自动填充字段。

基于媒体的建议

如果应用使用 MPPlayableContentManager API 播放媒体,则 iOS 10 允许用户通过锁屏界面上的应用查看专辑图片和播放媒体。

上下文 Siri 提醒

允许用户使用 Siri 快速发出提醒,以便稍后在应用中查看他们当前正在查看的内容。 例如,如果他们正在应用中查看餐厅评论,则可以调用 Siri 并说“回家后提醒我”。Siri 会生成提醒,其中包含指向应用中评论的链接。

基于联系人的建议

允许应用联系人(和联系人相关信息)与存储在系统中的所有用户联系人一起显示在 iOS 设备上的“联系人”应用中。

基于拼车的建议

如果拼车应用使用 MKDirectionsRequest API,则 iOS 10 会在用户可能想要乘坐时在应用切换器中将其显示为选项。 还必须通过在其 Info.plist 文件中为 MKDirectionsApplicationSupportedModes 键指定 MKDirectionsModeRideShare,将该应用注册为拼车应用。

如果该应用仅支持拼车,则系统建议将以“乘车前往…”开始,如果支持其他类型的路线方向(如步行或自行车),则系统将使用“获取路线…

重要

应用接收的 MKMapItem 对象可能不包含经度和纬度信息,并且需要地理编码。

实现主动建议

向 Xamarin.iOS 应用添加主动建议支持通常与实现几个 API 或扩展应用可能已实现的一些 API 一样简单。

主动建议主要通过三种方式与应用配合使用:

  • NSUserActivity 和 Schema.org - NSUserActivity 可帮助系统了解用户当前在屏幕上使用的信息。 Schema.org 为网页添加了类似的功能。
  • 位置建议 - 如果应用提供或使用基于位置的信息,这些 API 扩展提供了跨应用共享此信息的新方法。
  • 媒体应用建议 - 系统可以根据用户与 iOS 设备的交互上下文来推广应用及其媒体内容。

并且通过实现以下内容在应用中受支持:

  • Handoff - NSUserActivity 是在 iOS 8 添加的,以支持 Handoff,使开发人员能够在一台设备上启动活动,然后在另一台设备上继续该活动(请参阅 Handoff 简介)。
  • 聚焦搜索 - iOS 9 添加了使用 NSUserActivity 从聚焦搜索结果中推广应用内容的功能(请参阅使用核心聚焦搜索)。
  • 上下文 Siri 提醒 - iOS 10 中扩展了 NSUserActivity,允许 Siri 快速发出提醒,以便稍后查看用户当前在应用中查看的内容。
  • 位置建议 - iOS 10 增强了 NSUserActivity,以捕获应用内查看的位置,并在系统中的许多位置推广它们。
  • 上下文 Siri 请求 - NSUserActivity 为 Siri 提供应用内呈现的信息的上下文,以便用户可以通过从应用内调用 Siri 来获得方向或拨打电话。
  • 联系人交互 - iOS 10 中的新增功能,NSUserActivity 允许将通信应用从联系人卡片(在“联系人”应用中)提升为替代通信方法。

所有这些功能都有一个共同点,它们都以一种形式或另一种形式使用 NSUserActivity 来提供其功能。

NSUserActivity

如上所述,NSUserActivity 可帮助系统了解用户当前在屏幕上使用的信息。 NSUserActivity 是一种轻型状态缓存机制,用于在用户浏览应用时捕获用户的活动。 例如,看看餐厅应用:

The NSUserActivity light-weight state caching mechanism

通过以下交互:

  1. 当用户使用应用时,会创建一个 NSUserActivity,以便稍后重新创建应用的状态。
  2. 如果用户搜索餐厅,则会遵循相同的创建活动模式。
  3. 同样,当用户查看结果时。 在最后一种情况下,用户正在查看位置,在 iOS 10 中,系统更了解某些概念(如位置或通信交互)。

仔细看看最后一个屏幕:

The NSUserActivity details

在这里,应用正在创建一个 NSUserActivity 并且已填充了信息,以便稍后重新创建状态。 该应用还包含一些元数据,例如位置的名称和地址。 创建此活动后,应用会让 iOS 知道它代表用户的当前状态。

然后,应用决定是否无线会 Handoff 播发该活动,将其保存为位置建议的临时值,或添加到设备上的聚焦索引,以便在搜索结果中显示。

有关 Handoff 和聚焦搜索的详细信息,请参阅我们的 Handoff 简介iOS 9 新搜索 API 指南。

创建活动

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

看看一个活动示例:

// Create App 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;

// Enable capabilities
activity.EligibleForSearch = true;
activity.EligibleForHandoff = true;
activity.EligibleForPublicIndexing = true;

// Inform system of Activity
activity.BecomeCurrent();

使用活动类型标识符创建新活动。 接下来,将创建定义活动的一些元数据,以便以后可以还原此状态。 然后,为活动提供有意义的标题并附加到用户信息。 最后,启用某些功能,并将活动发送到系统。

通过进行以下更改,可以进一步增强上面的代码,以包括为活动提供上下文的元数据:

...

// Provide context
var attributes = new CSSearchableItemAttributeSet ("com.xamarin.location");
attributes.ThumbnailUrl = myThumbnailURL;
attributes.Keywords = new string [] { "software", "mobile", "language" }; 
activity.ContentAttributeSet = attributes;

// Inform system of Activity
activity.BecomeCurrent();

如果开发人员的网站能够显示与应用相同的信息,则应用可以包含 URL,并且内容可以显示在未安装应用的其他设备上(通过 Handoff):

// Restore on the web
activity.WebPageUrl = new NSUrl("http://xamarin.com/platform");

还原活动

若要响应用户点击应用的搜索结果 (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;
}

开发人员需要确保这是与上面创建的活动相同的活动类型标识符 (com.xamarin.platform)。 应用使用存储在 NSUserActivity 中的信息将状态还原回用户离开的位置。

创建活动的好处

通过上面提供的最少量代码,应用现在可以利用三个新的 iOS 10 功能:

  • Handoff
  • 聚焦搜索
  • 上下文 Siri 提醒

以下部分将介绍如何启用另外两项新的 iOS 10 功能:

  • 位置建议
  • 上下文 Siri 请求

基于位置的建议

以上面的餐厅搜索应用为例。 如果它已实现 NSUserActivity 并正确填充了所有元数据和属性,则用户将能够执行以下操作:

  1. 在应用中找到一家想要与朋友见面的餐厅。
  2. 当用户使用多任务应用切换器离开应用时,系统将自动显示建议(在屏幕底部),以便使用他们喜欢的导航应用获取餐厅的路线。
  3. 如果用户切换到“消息”应用并开始键入“见面位置”,QuickType 键盘将自动建议粘贴餐厅的地址。
  4. 如果用户切换到“地图”应用,则餐厅的地址将自动建议为目的地。
  5. 这甚至适用于第三方应用(支持 NSUserActivity),因此用户可以切换到拼车应用,餐厅的地址也会自动建议为目的地。
  6. 它还为 Siri 提供上下文,因此用户可以在餐厅应用中调用 Siri 并询问“获取路线…”,Siri 将提供用户正查看的餐厅的路线。

以上所有功能都有一个共同点,它们都指示了建议最初的来源。 在上面的例子中,它是一个虚构的餐厅评论应用。

iOS 10 经过增强,可通过对现有框架进行多项小型修改和添加,为应用启用此功能:

  • NSUserActivity 具有用于捕获在应用内查看的位置信息的其他字段。
  • 对 MapKit 和 CoreSpotlight 进行了一些添加以捕获位置。
  • 系统中的 Siri、地图、键盘、多任务处理和其他应用都添加了位置感知功能。

若要实现基于位置的建议,请从上面显示的相同活动代码开始:

// Create App 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;

// Enable capabilities
activity.EligibleForSearch = true;
activity.EligibleForHandoff = true;
activity.EligibleForPublicIndexing = true;

// Provide context
var attributes = new CSSearchableItemAttributeSet ("com.xamarin.location");
attributes.ThumbnailUrl = myThumbnailURL;
attributes.Keywords = new string [] { "software", "mobile", "language" }; 
activity.ContentAttributeSet = attributes;

// Restore on the web
activity.WebPageUrl = new NSUrl("http://xamarin.com/platform");

// Inform system of Activity
activity.BecomeCurrent();

如果应用使用 MapKit,则只需将当前映射 MKMapItem 添加到活动即可:

// Save MKMapItem location
activity.MapItem = myMapItem;

如果应用未使用 MapKit,则可以采用应用搜索并为位置指定以下新属性:

// Provide context
var attributes = new CSSearchableItemAttributeSet ("com.xamarin.location");
...

attributes.NamedLocation = "Apple Inc.";
attributes.SubThoroughfare = "1";
attributes.Thoroughfare = "Infinite Loop";
attributes.City = "Cupertino";
attributes.StateOrProvince = "CA";
attributes.Country = "United States";
attributes.Latitude = 37.33072;
attributes.Longitude = 122.029674;
attributes.PhoneNumbers = new string[]{"(800) 275-2273"};
attributes.SupportsPhoneCalls = true;
attributes.SupportsNavigation = true;

详细看看上述代码。 首先,每个实例都需要位置的名称:

attributes.NamedLocation = "Apple Inc.";

然后,基于文本的实例(如 QuickType 键盘)需要基于文本的位置说明:

attributes.SubThoroughfare = "1";
attributes.Thoroughfare = "Infinite Loop";
attributes.City = "Cupertino";
attributes.StateOrProvince = "CA";
attributes.Country = "United States";

纬度和经度是可选的,但请确保将用户路由到应用要向其发送的确切位置,因此应该包括在内:

attributes.Latitude = 37.33072;
attributes.Longitude = 122.029674;

通过设置电话号码,应用可以访问 Siri,因此用户可以通过说“给这个地方打电话”之类的话从应用调用 Siri:

attributes.PhoneNumbers = new string[]{"(800) 275-2273"};

最后,应用可以指示实例是否适合导航和电话呼叫:

attributes.SupportsPhoneCalls = true;
attributes.SupportsNavigation = true;

实现联系人交互

iOS 10 中的新增功能是,通信应用从联系人卡片深入集成到“联系人”应用中。 对于已实现联系人交互的应用,用户可以将给定应用的信息添加到联系人中的特定人员。 例如,如果他们点击卡片顶部的快速操作按钮发送消息,则附加的应用将作为发送消息的选项列出。

如果选择了第三方应用,则可以记住该应用,并将其作为下次用户想要联系特定人员时向其发送消息的默认方式。

联系人交互在应用中使用 NSUserActivity 和 iOS 10 中引入的新意图框架实现。 有关使用意图的更多详细信息,请参阅我们的了解 SiriKit 概念实现 SiriKit 指南。

捐赠交互

看看应用如何捐赠交互:

Donating Interactions overview

应用创建一个 INInteraction 对象,其中包含意图 (INIntent)、参与者元数据意图表示用户操作,例如进行视频呼叫或发送短信。 参与者包括接收通信的人员。 元数据定义添加信息,例如成功发送邮件等。

开发人员从不直接创建 INIntentINIntentResponse 的实例,他们将使用从这些父类继承的特定子类之一(基于应用代表用户完成的任务)。 例如,INSendMessageIntentINSendMessageIntentResponse 用于发送短信。

完全填充交互后,调用 DonateInteraction 方法来通知系统可以使用交互。

当用户从联系人卡片与应用交互时,交互会与 NSUserActivity 捆绑在一起,然后用于启动应用:

The interaction gets bundled with a NSUserActivity that is used to launch the app

看看下面的发送消息意图示例:

using System;
using Foundation;
using UIKit;
using Intents;

namespace MonkeyNotification
{
  public class DonateInteraction
  {
    #region Constructors
    public DonateInteraction ()
    {
    }
    #endregion

    #region Public Methods
    public void SendMessageIntent (string text, INPerson from, INPerson[] to)
    {

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

      // Define details
      var info = new NSMutableDictionary ();
      info.Add (new NSString ("message"), new NSString (text));

      // Populate Activity
      activity.Title = "Sent MonkeyChat Message";
      activity.UserInfo = info;

      // Enable capabilities
      activity.EligibleForSearch = true;
      activity.EligibleForHandoff = true;
      activity.EligibleForPublicIndexing = true;

      // Inform system of Activity
      activity.BecomeCurrent ();

      // Create message Intent
      var intent = new INSendMessageIntent (to, text, "", "MonkeyChat", from);

      // Create Intent Reaction
      var response = new INSendMessageIntentResponse (INSendMessageIntentResponseCode.Success, activity);

      // Create interaction
      var interaction = new INInteraction (intent, response);

      // Donate interaction to the system
      interaction.DonateInteraction ((err) => {
        // Handle donation error
        ...
      });
    }
    #endregion
  }
}

详细看看此代码,它会创建并填充 NSUserActivity 实例(如上面的创建活动部分所示)。 接下来,它会创建一个 INSendMessageIntent 实例(继承自 INIntent),并使用要发送的消息的详细信息填充该实例:

var intent = new INSendMessageIntent (to, text, "", "MonkeyChat", from);

将创建 INSendMessageIntentResponse 并传递上面创建的 NSUserActivity

var response = new INSendMessageIntentResponse (INSendMessageIntentResponseCode.Success, activity);

INInteraction 是从刚刚创建的发送消息意图 (INSendMessageIntent) 和响应 (INSendMessageIntentResponse) 生成的:

var interaction = new INInteraction (intent, response);

最后,系统会通知交互:

// Donate interaction to the system
interaction.DonateInteraction ((err) => {
  // Handle donation error
  ...
});

在应用可以响应捐赠成功或失败的位置传递完成事件处理器。

活动最佳做法

Apple 建议在处理活动时采用以下最佳做法:

  • 使用 NeedsSave 进行延迟有效负载更新。
  • 确保保持对当前活动的强引用。
  • 仅传输包含足够信息以还原状态的小型有效负载。
  • 通过使用反向 DNS 表示法指定活动类型标识符,确保它们是唯一的和描述性的。

Schema.org

如上所示,NSUserActivity 可帮助系统了解用户当前在屏幕上使用的信息。 Schema.org 为网页添加了类似的功能。

Schema.org 可以为网站提供相同类型的基于位置的交互。 Apple 设计了新的位置建议,以便在 Safari 中像在本机应用中一样工作。

一些 Schema.org 背景:

  • 它提供开放的 Web 标记词汇标准。
  • 它的工作原理是将结构化元数据包含在网页上。
  • 有 500 多个架构表示可用的各种概念。
  • 通过在网站上实现它,开发人员可以获得在本机应用中使用 NSUserActivity 的一些好处。

架构以树状结构排列,其中特定类型(如“餐厅”)继承自更通用的类型(如“当地企业”)。 有关详细信息,请参阅 Schema.org

例如,如果网页包含以下数据:

<script type="application/ld+json">
{
  "@context":"http://schema.org",
  "@type":"Restaurant",
  "telephone":"(415) 781-1111",
  "url":"https://www.yanksing.com",
  "address":{
    "@type":"PostalAddress",
    "streetAddress":"101 Spear St",
    "addressLocality":"San Francisco",
    "postalCode":"94105",
    "addressRegion":"CA"
  },
  "aggregateRating":{
    "@type":"AggregateRating",
    "ratingValue":"3.5",
    "reviewCount":"2022"
  }
}
</script>

如果用户在 Safari 中访问了此页面,然后切换到另一个应用,则会捕获页面中的位置信息,并在系统的其他部分作为位置建议提供(如上面的“活动”中所示)。

Safari 将提取网页上符合以下任何架构属性的任何内容:

  • PostalAddress
  • GeoCoordinates
  • 电话属性。

有关详细信息,请参阅我们的使用 Web 标记进行搜索指南。

使用位置建议

下一部分将介绍使用来自系统其他部分(如“地图”应用)或其他第三方应用的位置建议。

应用可以通过两种主要方式使用位置建议:

  • 通过 QuickType 键盘。
  • 直接通过使用路线规划应用中的位置信息。

位置建议和 QuickType 键盘

如果应用以基于文本的格式处理地址,则应用可以通过 QuickType UI 利用位置建议。iOS 10 使用以下功能扩展 QuickType UI:

  • 应用可以为 UI 中的文本字段添加有关语义意图的提示。
  • 应用可以在应用中获取主动建议。
  • 应用可以从增强的自动更正中受益。

iOS 10 中文本字段控件的新 TextContentType 属性允许开发人员定义用户将在给定字段中输入的值的语义意图。 例如:

var textField = new UITextField();
textField.TextContentType = UITextContentType.FullStreetAddress;

会告诉系统,应用期望用户在给定字段中输入完整的街道地址。 这样,当用户在此字段中输入值时,QuickType 键盘会自动在键盘上提供位置建议。

以下是 UITextContentType 静态类中开发人员可用的一些更常见的类型:

  • Name
  • GivenName
  • FamilyName
  • Location
  • FullStreetAddress
  • AddressCityAndState
  • TelephoneNumber
  • EmailAddress

路线规划应用和位置建议

本部分将介绍如何直接从路线规划应用中使用位置建议。 若要使路线规划应用添加此功能,开发人员将按如下所示利用现有的 MKDirectionsRequest 框架:

  • 在多任务处理中推广应用。
  • 将应用注册为路线规划应用。
  • 处理使用 MapKit MKDirectionsRequest 对象启动应用。
  • 使 iOS 能够根据用户参与,了解如何在适当时间向用户推荐应用。

当应用使用 MapKit MKDirectionsRequest 对象启动时,它应该自动开始向用户提供前往请求位置的路线,或者提供一个用户界面,让用户可以轻松地开始获取路线。 例如:

using System;
using Foundation;
using UIKit;
using MapKit;
using CoreLocation;

namespace MonkeyChat
{
  [Register ("AppDelegate")]
  public class AppDelegate : UIApplicationDelegate, IUISplitViewControllerDelegate
  {
    ...
    
    public override bool OpenUrl (UIApplication app, NSUrl url, NSDictionary options)
    {
      if (MKDirectionsRequest.IsDirectionsRequestUrl (url)) {
        var request = new MKDirectionsRequest (url);
        var coordinate = request.Destination?.Placemark.Location?.Coordinate;
        var address = request.Destination.Placemark.AddressDictionary;
        if (coordinate.IsValid()) {
          var geocoder = new CLGeocoder ();
          geocoder.GeocodeAddress (address, (place, err) => {
            // Handle the display of the address

          });
        }
      }

      return true;
    }
  }    
}

详细看看此代码。 它测试它是否是有效的目的地请求:

if (MKDirectionsRequest.IsDirectionsRequestUrl(url)) {

如果是,则从 URL 创建 MKDirectionsRequest

var request = new MKDirectionsRequest(url);

在 iOS 10 中,可以向应用发送没有地理坐标的地址,这会导致开发人员需要对地址进行编码:

var geocoder = new CLGeocoder();
geocoder.GeocodeAddress(address, (place, err)=> {
  // Handle the display of the address
  
});

媒体应用建议

如果应用使用 iOS 10 处理任何类型的媒体,例如播客应用或流式传输媒体内容(如音频或视频),则可以利用系统中的媒体建议。

对于处理媒体的应用,iOS 支持以下行为:

  • iOS 根据用户以前的行为推广用户可能使用的应用。
  • 与应用相关的建议将显示在“聚焦”和“今天”视图中。
  • 如果应用满足以下触发器之一,则可能将其提升为锁屏界面建议:
    • 插入耳机或蓝牙设备连接后。
    • 上车后。
    • 到家或上班后。

通过在 iOS 10 中包含简单的 API 调用,开发人员可以为媒体应用的用户创建更具吸引力的锁屏界面体验。 通过使用 MPPlayableContentManager 类来管理媒体播放,完整的媒体控件(如“音乐”应用呈现的内容)将显示在应用的锁屏界面上。

using System;
using MediaPlayer;
using UIKit;

namespace MonkeyPlayer
{
  public class PlayableContentDelegate : MPPlayableContentDelegate
  {
    #region Constructors
    public PlayableContentDelegate ()
    {
    }
    #endregion

    #region Override methods
    public override void InitiatePlaybackOfContentItem (MPPlayableContentManager contentManager, Foundation.NSIndexPath indexPath, Action<Foundation.NSError> completionHandler)
    {
      // Access the media item to play
      var item = LoadMediaItem (indexPath);

      // Populate the lock screen
      PopulateNowPlayingItem (item);

      // Prep item to be played
      var status = PreparePlayback (item);

      // Call completion handler
      completionHandler (null);
    }
    #endregion

    #region Public Methods
    public MPMediaItem LoadMediaItem (Foundation.NSIndexPath indexPath)
    {
      var item = new MPMediaItem ();

      // Load item from media store
      ...

      return item;
    }

    public void PopulateNowPlayingItem (MPMediaItem item)
    {
      // Get Info Center and album art
      var infoCenter = MPNowPlayingInfoCenter.DefaultCenter;
      var albumArt = (item.Artwork == null) ? new MPMediaItemArtwork (UIImage.FromFile ("MissingAlbumArt.png")) : item.Artwork;

      // Populate Info Center
      infoCenter.NowPlaying.Title = item.Title;
      infoCenter.NowPlaying.Artist = item.Artist;
      infoCenter.NowPlaying.AlbumTitle = item.AlbumTitle;
      infoCenter.NowPlaying.PlaybackDuration = item.PlaybackDuration;
      infoCenter.NowPlaying.Artwork = albumArt;
    }

    public bool PreparePlayback (MPMediaItem item)
    {
      // Prepare media item for playback
      ...

      // Return results
      return true;
    }
    #endregion
  }
}

总结

本文介绍了主动建议,并介绍了开发人员如何使用它们来驱动 Xamarin.iOS 应用的流量。 它介绍了实现主动建议的步骤并提供了使用指南。