Introducción a las sugerencias proactivas en Xamarin.iOS

En este artículo se muestra cómo usar sugerencias proactivas en la aplicación de Xamarin.iOS para impulsar la interacción al permitir que el sistema presente de forma proactiva información útil automáticamente al usuario.

Como novedad en iOS 10, las Sugerencias proactivas presentan nuevas formas para que los usuarios interactúen con una aplicación de Xamarin.iOS al presentar de forma proactiva información útil automáticamente al usuario en los momentos adecuados.

iOS 10 presenta nuevas formas de impulsar la interacción con la aplicación al permitir que el sistema muestre de forma proactiva información útil automáticamente al usuario en momentos adecuados. Al igual que iOS 9 proporcionó la capacidad de agregar búsqueda profunda a la aplicación mediante Sugerencias de Spotlight, Entrega y Siri (consulte Nuevas API de búsqueda), con iOS 10 una aplicación puede exponer la funcionalidad que el sistema puede presentar al usuario desde las siguientes ubicaciones:

  • El conmutador de aplicaciones
  • La pantalla de bloqueo
  • CarPlay
  • Maps
  • Interacciones de Siri
  • Sugerencias de QuickType

La aplicación expone esta funcionalidad al sistema mediante una colección de tecnologías como NSUserActivity, marcado web, Spotlight principal, MapKit, Reproductor multimedia y UIKit. Además, al proporcionar compatibilidad proactiva con sugerencias para la aplicación, obtiene una integración más profunda de Siri de forma gratuita.

Sugerencias basadas en la ubicación

Como novedad en iOS 10, la clase NSUserActivity incluye una propiedad MapItem que permite al desarrollador proporcionar información de ubicación que se puede usar en otros contextos. Por ejemplo, si la aplicación muestra revisiones de restaurantes, el desarrollador puede establecer la propiedad MapItem en la ubicación del restaurante que el usuario está viendo en la aplicación. Si el usuario cambia a la aplicación Mapas, la ubicación del restaurante estará disponible automáticamente.

Si la aplicación admite App Search, puede usar los nuevos componentes de dirección de la clase CSSearchableItemAttributesSet para especificar ubicaciones que el usuario quiera visitar. Al establecer la propiedad MapItem, las demás propiedades se rellenan automáticamente.

Además de establecer la Latitude y la Longitude de las propiedades del componente de dirección, se recomienda que la aplicación proporcione también las propiedades NamedLocation y PhoneNumbers, para que Siri pueda iniciar una llamada a la ubicación.

Sugerencias basadas en marcado web

iOS 9 ha agregado la capacidad de incluir el marcado de datos estructurados en el sitio web que enriquece el contenido que ven los usuarios en los resultados de búsqueda de Spotlight y Safari (consulte Búsqueda con marcado web). iOS 10 agrega la capacidad de incluir marcado basado en la ubicación (como PostalAddress tal como se define en Schema.org) para mejorar aún más la experiencia del usuario. Por ejemplo, si un usuario ve una página marcada por una ubicación en el sitio web, el sistema puede sugerir la misma ubicación al abrir Mapas.

Sugerencias basadas en texto

UIKit se ha expandido en iOS 10 para incluir la propiedad TextContentType de la clase UITextInputTraits para especificar el significado semántico del contenido en un área de texto. Con esta información en su lugar, el sistema normalmente puede seleccionar automáticamente el tipo de teclado adecuado, mejorar las sugerencias de autocorrección e integrar de forma proactiva información de otras aplicaciones y sitios web.

Por ejemplo, si el usuario escribe texto en un campo de texto marcado UITextContentType.FullStreetAddress, el sistema puede sugerir rellenar automáticamente el campo con la ubicación que el usuario ha visto recientemente.

Sugerencias basadas en medios

Si la aplicación reproduce elementos multimedia mediante la API de MPPlayableContentManager, iOS 10 permite a los usuarios ver la imagen del álbum y reproducir elementos multimedia a través de la aplicación en la pantalla de bloqueo.

Recordatorios contextuales de Siri

Permite al usuario usar Siri para hacer rápidamente un recordatorio para ver el contenido que está viendo actualmente en la aplicación en una fecha posterior. Por ejemplo, si estuvieran viendo una revisión del restaurante en la aplicación, podrían invocar a Siri y decir "Recuérdame esto cuando llegue a casa". Siri generaría el aviso con un vínculo a la revisión en la aplicación.

Sugerencias basadas en contactos

Permite que los contactos de la aplicación (y la información relacionada con el contacto) aparezcan en la aplicación Contactos en el dispositivo iOS junto con todos los contactos de los usuarios almacenados en el sistema.

Sugerencias basadas en uso compartido de carreras

Si una aplicación de uso compartido de paseos usa la API de MKDirectionsRequest, iOS 10 la presentará como una opción en el conmutador de la aplicación en ocasiones cuando el usuario quiera un paseo. La aplicación también debe registrarse como una aplicación de uso compartido mediante la especificación del MKDirectionsModeRideShare para la clave de MKDirectionsApplicationSupportedModes en su archivo Info.plist.

Si la aplicación solo admite el uso compartido de paseos, la sugerencia del sistema comenzaría con "Obtener un paseo...", si se admiten otros tipos de dirección de enrutamiento (como Caminar o Bicicleta), el sistema usará "Obtener instrucciones para..."

Importante

El objeto MKMapItem que recibe la aplicación puede no incluir información de longitud y latitud y requerirá geocodificación.

Implementación de sugerencias proactivas

Agregar compatibilidad con sugerencias proactivas a una aplicación de Xamarin.iOS suele ser tan fácil como implementar algunas API o expandirse en algunas API que es posible que la aplicación ya esté implementando.

Las sugerencias proactivas funcionan con las aplicaciones de tres maneras principales:

  • NSUserActivity y Schema.org - NSUserActivity ayudan al sistema a comprender con qué información está trabajando actualmente el usuario en pantalla. Schema.org agrega capacidades similares a las páginas web.
  • Sugerencias de ubicación: si la aplicación ofrece o consume información basada en la ubicación, esta extensión de API ofrece nuevas formas de compartir esta información entre aplicaciones.
  • Sugerencias de aplicaciones multimedia: el sistema puede promover la aplicación y su contenido multimedia en función del contexto de la interacción del usuario con el dispositivo iOS.

Además, se admite en la aplicación mediante la implementación de lo siguiente:

  • Entrega - NSUserActivity se agregó en iOS 8 para admitir Entrega, lo que permite al desarrollador iniciar una actividad en un dispositivo y continuar en otro (consulte Introducción a Entrega).
  • Búsqueda de Spotlight: iOS 9 agregó la capacidad de promover el contenido de la aplicación desde los resultados de la Búsqueda de Spotlight mediante NSUserActivity (consulte Búsqueda con Spotlight).
  • Recordatorios contextuales de Siri: en iOS 10, NSUserActivity se ha ampliado para permitir que Siri haga rápidamente un recordatorio para ver el contenido que el usuario está viendo actualmente en la aplicación en una fecha posterior.
  • Sugerencias de ubicación: iOS 10 mejora NSUserActivity para capturar ubicaciones vistas dentro de la aplicación y promoverlas en muchos lugares del sistema.
  • Solicitudes contextuales de Siri - NSUserActivity proporciona contexto a la información presentada dentro de la aplicación a Siri para que el usuario pueda obtener instrucciones o realizar una llamada invocando a Siri desde la aplicación.
  • Interacciones de contacto: como novedad en iOS 10, NSUserActivity permite que las aplicaciones de comunicaciones se promuevan desde una tarjeta de contacto (en la aplicación Contactos) como método de comunicación alternativo.

Todas estas características tienen una cosa en común, todas usan NSUserActivity de una forma u otra para proporcionar su funcionalidad.

NSUserActivity

Como se indicó anteriormente, NSUserActivity ayuda al sistema a comprender con qué información está trabajando actualmente el usuario en pantalla. NSUserActivity es un mecanismo de almacenamiento en caché de estado ligero para capturar la actividad del usuario a medida que navega por la aplicación. Por ejemplo, consultando una aplicación de restaurante:

The NSUserActivity light-weight state caching mechanism

Con las interacciones siguientes:

  1. A medida que el usuario trabaja con la aplicación, se crea un NSUserActivity para volver a crear el estado de la aplicación más adelante.
  2. Si el usuario busca un restaurante, se sigue el mismo patrón de creación de actividades.
  3. Y de nuevo, cuando el usuario ve un resultado. En este último caso, el usuario está viendo una ubicación y, en iOS 10, el sistema es más consciente de ciertos conceptos (como la ubicación o las interacciones de comunicación).

Eche un vistazo a la última pantalla:

The NSUserActivity details

Aquí la aplicación está creando un NSUserActivity y se ha rellenado con información para volver a crear el estado más adelante. La aplicación también ha incluido algunos metadatos, como el nombre y la dirección de la ubicación. Con esta actividad creada, la aplicación permite a iOS saber que representa el estado actual del usuario.

A continuación, la aplicación decide si la actividad se anunciará por vía inalámbrica para Entrega, se guardará como un valor temporal para las sugerencias de ubicación o se agregará al índice de Spotlight en el dispositivo para mostrarse en los resultados de la búsqueda.

Para obtener más información sobre la búsqueda de Spotlight destacado y Entrega, consulte nuestras guías de Introducción a Entrega and Nuevas API de Búsqueda de iOS 9.

Creación de una actividad

Antes de crear una actividad, será necesario crear un identificador del tipo de actividad para identificarla. El identificador de tipo de actividad es una cadena corta agregada a la matriz NSUserActivityTypes del archivo Info.plist de la aplicación que se usa para identificar de forma única un tipo de actividad de usuario determinado. Habrá una entrada en la matriz para cada actividad que la aplicación admita y exponga a la Búsqueda de aplicaciones. Consulte nuestra Referencia de creación de identificadores de tipo de actividad para obtener más detalles.

Vea un ejemplo de una actividad:

// 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();

Se crea una nueva actividad mediante un identificador de tipo de actividad. A continuación, se crean algunos metadatos que definen la actividad para que este estado se pueda restaurar más adelante. Después, la actividad recibe un título significativo y se adjunta a la información del usuario. Por último, algunas funcionalidades están habilitadas y la actividad se envía al sistema.

El código anterior podría mejorarse aún más para incluir metadatos que proporcionan contexto a la actividad realizando los siguientes cambios:

...

// 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();

Si el desarrollador tiene un sitio web capaz de mostrar la misma información que la aplicación, la aplicación puede incluir la dirección URL y el contenido se puede mostrar en otros dispositivos que no tienen instalada la aplicación (a través de Entrega):

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

Restauración de una actividad

Para responder al usuario que pulsa en un resultado de búsqueda (NSUserActivity) para la aplicación, edite el archivo AppDelegate.cs e invalide el método ContinueUserActivity. Por ejemplo:

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

El desarrollador deberá asegurarse de que se trata del mismo identificador de tipo de actividad (com.xamarin.platform) que el de la actividad creada anteriormente. La aplicación usa la información almacenada en la NSUserActivity para restaurar el estado a donde el usuario lo dejó.

Ventajas de crear una actividad

Con la cantidad mínima de código presentada anteriormente, la aplicación ahora puede aprovechar tres nuevas características de iOS 10:

  • Handoff
  • Búsqueda de Spotlight
  • Recordatorios contextuales de Siri

En la sección siguiente se examinará la habilitación de otras dos nuevas características de iOS 10:

  • Sugerencias de ubicación
  • Solicitudes contextuales de Siri

Sugerencias basadas en la ubicación

Tome el ejemplo de la aplicación de búsqueda de restaurantes anterior. Si se ha implementado NSUserActivity y rellenado correctamente todos los metadatos y atributos, el usuario podría hacer lo siguiente:

  1. En la aplicación, encuentra un restaurante en el que le gustaría reunirse con un amigo.
  2. A medida que el usuario sale de la aplicación mediante el conmutador de aplicaciones multitarea, el sistema mostrará automáticamente una sugerencia (en la parte inferior de la pantalla) para obtener instrucciones para llegar al restaurante mediante su aplicación de navegación favorita.
  3. Si el usuario cambia a la aplicación Mensajes y comienza a escribir "Vamos a vernos en", el teclado QuickType sugerirá automáticamente pegar la dirección del restaurante.
  4. Si el usuario cambia a la aplicación Mapas, la dirección del restaurante se sugiere automáticamente como destino.
  5. Esto incluso funciona para aplicaciones de terceros (que admiten NSUserActivity), por lo que el usuario puede cambiar a una aplicación de uso compartido de paseos y la dirección del restaurante también se sugiere como destino allí.
  6. También proporciona contexto a Siri, por lo que el usuario puede invocar a Siri dentro de la aplicación del restaurante y preguntar "Obtener direcciones..." y Siri proporcionará instrucciones para llegar al restaurante que el usuario está viendo.

Toda la funcionalidad anterior tiene una cosa en común, todas indican de dónde proviene originalmente la sugerencia. En el caso del ejemplo anterior, es la aplicación ficticia de revisión de restaurantes.

Se ha mejorado iOS 10 para habilitar esta funcionalidad para una aplicación a través de varias modificaciones pequeñas y adiciones a marcos existentes:

  • NSUserActivity tiene campos adicionales para capturar información de ubicación que se ve dentro de la aplicación.
  • Se han realizado varias adiciones a MapKit y CoreSpotlight para capturar la ubicación.
  • La funcionalidad con reconocimiento de ubicación se ha agregado a Siri, Mapas, Teclados, Multitarea y otras aplicaciones dentro del sistema.

Para implementar sugerencias basadas en la ubicación, comience con el mismo código de actividad presentado anteriormente:

// 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();

Si la aplicación usa MapKit, es tan simple como agregar el mapa actual MKMapItem a la actividad:

// Save MKMapItem location
activity.MapItem = myMapItem;

Si la aplicación no usa MapKit, puede adoptar la Búsqueda de aplicaciones y especificar los siguientes atributos nuevos para la ubicación:

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

Eche un vistazo al código anterior en detalle. En primer lugar, el nombre de la ubicación es necesario en cada instancia:

attributes.NamedLocation = "Apple Inc.";

A continuación, se requiere la descripción basada en texto de la ubicación para las instancias basadas en texto (como el teclado QuickType):

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

La latitud y la longitud son opcionales, pero asegúrese de que el usuario se enruta a la ubicación exacta a la que quiere enviar la aplicación, por lo que debe incluirse:

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

Al establecer los números de teléfono, la aplicación puede obtener acceso a Siri para que el usuario pueda invocar a Siri desde la aplicación diciendo algo parecido a "Llamar a este lugar":

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

Por último, la aplicación puede indicar si la instancia es adecuada para las llamadas telefónicas y de navegación:

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

Implementación de Interacciones de contactos

Como novedad de iOS 10, las aplicaciones de comunicación están profundamente integradas en la aplicación Contactos desde la tarjeta de contacto. En el caso de las aplicaciones que han implementado Interacciones de contacto, el usuario puede agregar la información de la aplicación dada a personas específicas de sus contactos. Y si, por ejemplo, pulsan el botón de acción rápida en la parte superior de una tarjeta para enviar un mensaje, la aplicación adjunta se mostrará como una opción para enviar el mensaje.

Si se selecciona una aplicación de terceros, se puede recordar y presentar como la forma predeterminada de enviar un mensaje a la persona dada la próxima vez que el usuario quiera ponerse en contacto con ella.

Las Interacciones de contacto se implementan en la aplicación mediante NSUserActivity y el nuevo marco de intenciones introducido en iOS 10. Para obtener más información sobre cómo trabajar con intenciones, consulte nuestras guías de Descripción de los conceptos de SiriKit e Implementación de SiriKit.

Donación de interacciones

Eche un vistazo a cómo la aplicación puede donar interacciones:

Donating Interactions overview

La aplicación crea un objeto INInteraction que contiene una Intención (INIntent), Participantes y Metadatos. La Intención representa una acción del usuario, como realizar una llamada de vídeo o enviar un mensaje de texto. Los Participantes incluyen a las personas que reciben la comunicación. Los Metadatos definen información adicional, como enviar correctamente el mensaje, etc.

El desarrollador nunca crea directamente una instancia de INIntent o INIntentResponse, usará una de las clases secundarias específicas (en función de la tarea que realiza la aplicación en nombre del usuario) que heredan de estas clases primarias. Por ejemplo, INSendMessageIntent y INSendMessageIntentResponse para enviar un mensaje de texto.

Una vez que la interacción se haya rellenado por completo, llame al método DonateInteraction para informar al sistema que la interacción está disponible para su uso.

Cuando el usuario interactúa con la aplicación desde la tarjeta de contacto, la interacción se agrupa con un NSUserActivity, que se usa para iniciar la aplicación:

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

Eche un vistazo al ejemplo siguiente de una intención de enviar mensaje:

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

Al examinar este código con detalle, se crea y rellena una instancia de NSUserActivity (como se muestra en la sección Creación de una actividad anterior). A continuación, crea una instancia de INSendMessageIntent (que hereda de INIntent) y la rellena con los detalles del mensaje que se envía:

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

Se crea un INSendMessageIntentResponse y se pasa la NSUserActivity creado anteriormente:

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

Un INInteraction se crea a partir de la intención de enviar mensaje (INSendMessageIntent) y la respuesta (INSendMessageIntentResponse) que acaba de crear:

var interaction = new INInteraction (intent, response);

Por último, el sistema recibe una notificación de la interacción:

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

Se pasa un controlador de finalización en el que la aplicación puede responder a la donación con éxito o con errores.

Procedimientos recomendados de actividades

Apple sugiere los siguientes procedimientos recomendados al trabajar con actividades:

  • Use NeedsSave para las actualizaciones de carga diferida.
  • Asegúrese de mantener una referencia segura a la actividad actual.
  • Solo transfiera cargas pequeñas que incluyan suficiente información para restaurar el estado.
  • Asegúrese de que los identificadores de tipo de actividad son únicos y descriptivos mediante la notación de DNS inverso para especificarlos.

Schema.org

Como se indicó anteriormente, NSUserActivity ayuda al sistema a comprender con qué información está trabajando actualmente el usuario en pantalla. Schema.org agrega capacidades similares a las páginas web.

Schema.org puede proporcionar los mismos tipos de interacciones basadas en la ubicación al sitio web. Apple diseñó las nuevas sugerencias de ubicación para funcionar igual de bien cuando se ven en Safari o en una aplicación nativa.

Algunos antecedentes de Schema.org:

  • Proporciona un estándar de vocabulario de marcado web abierto.
  • Funciona mediante la inclusión de metadatos estructurados en páginas web.
  • Hay más de 500 esquemas que representan varios conceptos disponibles.
  • Al implementarlo en el sitio web, el desarrollador puede adquirir algunas de las ventajas de usar NSUserActivity en una aplicación nativa.

Los esquemas se organizan en un árbol como estructura, donde tipos específicos, como Restaurante, heredan de tipos más genéricos, como Negocios locales. Para obtener más información, consulte Schema.org.

Por ejemplo, si la página web incluía los datos siguientes:

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

Si el usuario visitó esta página en Safari y, a continuación, cambió a otra aplicación, la información de ubicación de la página se capturará y se ofrecerá como sugerencia de ubicación en otras partes del sistema (como se muestra en Actividades anteriores).

Safari extraerá cualquier cosa en una página web que cumpla cualquiera de las siguientes propiedades de esquema:

  • PostalAddress
  • GeoCoordinates
  • Propiedad telefónica.

Para obtener más información, consulte nuestra guía de Búsqueda con marcado web.

Consumir sugerencias de ubicación

En esta sección siguiente se tratará el consumo de sugerencias de ubicación que proceden de otras partes del sistema (como la aplicación de Mapas) u otras aplicaciones de terceros.

Hay dos formas principales de que la aplicación pueda consumir sugerencias de ubicación:

  • Mediante el teclado QuickType.
  • Para ello, consuma directamente la información de ubicación en las aplicaciones de enrutamiento.

Sugerencias de ubicación y el teclado QuickType

Si la aplicación trata las direcciones en formatos basados en texto, la aplicación puede aprovechar las sugerencias de ubicación a través de la interfaz de usuario de QuickType. iOS 10 expande la interfaz de usuario de QuickType con las siguientes características:

  • La aplicación puede agregar sugerencias sobre la intención semántica de los campos de texto en la interfaz de usuario.
  • La aplicación puede obtener sugerencias proactivas en la aplicación.
  • La aplicación puede beneficiarse de la autocorrección mejorada.

La nueva propiedad TextContentType de los controles de campo de texto en iOS 10 permite al desarrollador definir la intención semántica para el valor que el usuario va a escribir en un campo determinado. Por ejemplo:

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

Indicaría al sistema que la aplicación espera que el usuario escriba una dirección postal completa en el campo especificado. Esto permitirá que el teclado QuickType proporcione automáticamente sugerencias de ubicación en el teclado cuando el usuario escriba un valor en este campo.

A continuación se muestran algunos de los tipos más comunes disponibles para el desarrollador en la clase estática UITextContentType:

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

Sugerencias de enrutamiento de aplicaciones y ubicaciones

En esta sección se examinará el consumo de sugerencias de ubicación directamente desde una aplicación de enrutamiento. Para que la aplicación de enrutamiento agregue esta funcionalidad, el desarrollador aprovechará el marco de MKDirectionsRequest existente de la siguiente manera:

  • Para promover la aplicación en Multitarea.
  • Para registrar la aplicación como una aplicación de enrutamiento.
  • Para controlar el inicio de la aplicación con un objeto MapKit MKDirectionsRequest.
  • Para ofrecer a iOS la capacidad de aprender a sugerir la aplicación al usuario en momentos adecuados, en función de la interacción del usuario.

Cuando la aplicación se inicia con un objeto MapKit MKDirectionsRequest, debería empezar a proporcionar automáticamente las instrucciones al usuario para la ubicación solicitada o presentar una interfaz de usuario que le facilite empezar a obtener instrucciones. Por ejemplo:

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

Echemos un vistazo a este código con detalle. Compruebe si es una solicitud de destino válida:

if (MKDirectionsRequest.IsDirectionsRequestUrl(url)) {

Si es así, cree a MKDirectionsRequest partir de la dirección URL:

var request = new MKDirectionsRequest(url);

Como novedad en iOS 10, se puede enviar a la aplicación una dirección que no tenga geo-coordenadas; en ese caso el desarrollador necesita codificar la dirección:

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

Sugerencias de aplicaciones multimedia

Si la aplicación controla cualquier tipo de medio, como una aplicación de podcast o un contenido multimedia de streaming, como audio o vídeo, con iOS 10, puede aprovechar las sugerencias multimedia en el sistema.

En el caso de las aplicaciones que controlan los medios, iOS admite los comportamientos siguientes:

  • iOS promueve las aplicaciones que es probable que el usuario use en función de su comportamiento anterior.
  • Las sugerencias relacionadas con la aplicación se mostrarán en Spotlight y la Vista de hoy.
  • Si la aplicación cumple uno de los siguientes desencadenadores, podría elevarse a una sugerencia de pantalla de bloqueo:
    • Después de conectar auriculares o un si dispositivo Bluetooth hace una conexión.
    • Después de entrar en un coche.
    • Después de llegar a casa o trabajo.

Al incluir una llamada API simple en iOS 10, el desarrollador puede crear una experiencia de pantalla de bloqueo más atractiva para los usuarios de la aplicación multimedia. Mediante el uso de la clase MPPlayableContentManager para administrar la reproducción multimedia, los controles multimedia completos (como los presentados por la aplicación Música) se mostrarán en la pantalla de bloqueo de la aplicación.

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

Resumen

En este artículo se han tratado sugerencias proactivas y se ha mostrado cómo el desarrollador puede usarlas para impulsar el tráfico a la aplicación Xamarin.iOS. Se han tratado los pasos para implementar sugerencias proactivas y presentar instrucciones de uso.