Sugerencias proactivas de watchOS en Xamarin

En este artículo se muestra cómo utilizar Sugerencias proactivas en una aplicación de watchOS 3 para impulsar el compromiso permitiendo que el sistema presente de forma proactiva información útil automáticamente al usuario.

Como novedad en watchOS 3, las sugerencias proactivas presentan nuevas formas de que los usuarios interactúen con una aplicación de Xamarin.iOS mediante la presentación proactiva y automática de información útil al usuario en los momentos adecuados.

Acerca de las sugerencias proactivas

Como novedad en watchOS 3, NSUserActivity incluye una propiedad MapItem que permite a la aplicación proporcionar información de ubicación que puede utilizarse en otros contextos. Por ejemplo, si la aplicación muestra reseñas de hoteles y proporciona una ubicación MapItem, si el usuario cambia a la aplicación Mapas, la ubicación del hotel que acaba de ver estará disponible.

La aplicación expone esta funcionalidad al sistema utilizando un conjunto de tecnologías como NSUserActivity, MapKit, Media Player 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 watchOS 3, la clase NSUserActivity incluye una propiedad MapItem que permite al desarrollador proporcionar información de ubicación que puede utilizarse 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 la Búsqueda´de aplicaciones, 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 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.

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 recordatorio con un vínculo a la reseña en la aplicación.

Implementación de sugerencias proactivas

Agregar compatibilidad con Sugerencia proactiva a la aplicación de Xamarin.iOS suele ser tan fácil como implementar algunas API o ampliar algunas API que la aplicación ya implemente.

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

  • NSUserActivity - Ayuda al sistema a comprender con qué información está trabajando actualmente el usuario en la pantalla.
  • 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.

Y se admite en la aplicación mediante la implementación de lo siguiente:

  • Recordatorios contextuales de Siri: en iOS 10, NSUserActivity se ha ampliado para permitir a Siri hacer rápidamente un recordatorio para ver el contenido que están 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.

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, revisando la aplicación de restaurantes:

The restaurant app

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 payload

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 del lugar. 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 y Entrega, consulte nuestras guías de Introducción a Entrega y 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 por 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. Luego, se crean algunos metadatos que definen la actividad para que este estado se pueda restaurar más adelante. Luego, la actividad recibe un título significativo y se adjunta a la información del usuario. Por último, se habilitan algunas funcionalidades y se envía la actividad 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, esta puede incluir la URL y el contenido se puede mostrar en otros dispositivos que no tengan 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 y anule 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;
}

Asegúrese de que se trata del mismo identificador de tipo de actividad (com.xamarin.platform) que 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 mínima cantidad de código presentada anteriormente, la aplicación es ahora capaz de tomar ventaja de tres nuevas características de iOS 10:

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

En la siguiente sección echaremos un vistazo a la activación de otras dos nuevas funciones 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. Si se ha implementado NSUserActivity y rellenado correctamente todos los metadatos y atributos, el usuario podría hacer lo siguiente:

  1. Encontrar en la aplicación un restaurante en el que les gustaría reunirse con un amigo.
  2. Si el usuario cambia a la aplicación Maps, la dirección del restaurante es sugerida de forma automática como destino.
  3. Esto incluso funciona para aplicaciones de terceros (compatiblesNSUserActivity), 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í.
  4. También proporciona contexto a Siri, por lo que el usuario puede invocar a Siri dentro de la aplicación del restaurante y preguntarle "Obtener indicaciones..." 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, se trata de la aplicación ficticia de reseñas de restaurantes.

watchOS 3 se ha mejorado para permitir esta funcionalidad para una aplicación a través de varias pequeñas modificaciones y adiciones a los 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.
  • Se han agregado funciones de localización a Siri, Maps, Multitarea y otras aplicaciones 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 localidad es obligatorio en todos los casos:

attributes.NamedLocation = "Apple Inc.";

Luego, la descripción basada en texto en necesaria 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 garantizan que el usuario sea dirigido a la ubicación exacta a la que la aplicación desea enviarle:

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

Al configurar los números de teléfono, la aplicación puede acceder a Siri para que el usuario pueda invocar a Siri desde la aplicación diciendo algo como *"Llamar a este lugar »*:

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

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

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

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.

Uso de sugerencias de lugares

La siguiente sección tratará sobre el uso de sugerencias de ubicación procedentes de otras partes del sistema (como la aplicación Maps) o de otras aplicaciones de terceros.

Sugerencias de enrutamiento de aplicaciones y ubicaciones

En esta sección se analizará el uso de las 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.
  • Conceda a watchOS la capacidad de aprender a sugerir la aplicación en función de la participació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 lo es, crea una MKDirectionsRequest a partir de la URL:

var request = new MKDirectionsRequest(url);

Como novedad en watchOS 3, 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

});

Resumen

En este artículo se han tratado las Sugerencias proactivas y se ha mostrado cómo el desarrollador puede utilizarlas para dirigir tráfico a una aplicación de Xamarin.iOS para watchOS. Cubrió el paso para implementar Sugerencias Proactivas y presentó instrucciones de uso.