sugerencias proactivas de watchOS en Xamarin

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

Novedad de watchOS 3, Las sugerencias proactivas presentan formas de noticias para que los usuarios interactúen con una aplicación de Xamarin.iOS mediante la presentación proactiva de información útil automáticamente al usuario en los momentos adecuados.

Acerca de las sugerencias proactivas

Novedad de watchOS 3, NSUserActivity incluye una MapItem propiedad que permite a la aplicación proporcionar información de ubicación que se puede usar en otros contextos. Por ejemplo, si la aplicación muestra las opiniones de hoteles y proporciona una MapItem ubicación, si el usuario cambió a la aplicación Maps, la ubicación del hotel que solo estaba viendo estaría disponible.

La aplicación expone esta funcionalidad al sistema mediante una colección 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 ubicación

Novedad de watchOS 3, la NSUserActivity clase incluye una MapItem propiedad 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 MapItem propiedad en la ubicación del restaurante que el usuario está viendo en la aplicación. Si el usuario cambia a la aplicación Maps, 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 CSSearchableItemAttributesSet clase para especificar las ubicaciones que el usuario puede visitar. Al establecer la MapItem propiedad , las demás propiedades se rellenan automáticamente.

Además de establecer las Latitude propiedades y Longitude del componente de dirección, se recomienda que la aplicación proporcione las NamedLocation propiedades 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án viendo actualmente en la aplicación en una fecha posterior. Por ejemplo, si estuvieran viendo una revisión de restaurante en la aplicación, podrían invocar Siri y decir "Recordarme sobre esto cuando llegue a casa". Siri generaría el aviso con un vínculo a la revisión en la aplicación.

Implementación de sugerencias proactivas

Agregar compatibilidad con sugerencias proactivas a la 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 - Ayuda al sistema a comprender con qué información está trabajando actualmente el usuario en 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 que Siri realice 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 - NSUserActivity Siri 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 Siri desde dentro de 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, mirando la aplicación de restaurante:

La aplicación de restaurante

Con las interacciones siguientes:

  1. A medida que el usuario trabaja con la aplicación, se crea para NSUserActivity 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 otra vez, 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 más de cerca a la última pantalla:

La carga de NSUserActivity

Aquí la aplicación está creando y NSUserActivity 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 Handoff, se guardará como un valor temporal para las sugerencias de ubicación o se agregará al índice spotlight en el dispositivo para mostrar en los resultados de búsqueda.

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

Creación de una actividad

Antes de crear una actividad, es necesario crear un identificador de tipo de actividad para identificarlo. El identificador de tipo de actividad es una cadena corta agregada a la NSUserActivityTypes matriz del archivo de Info.plist 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 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. A continuación, la actividad recibe un título significativo y se adjunta a la información del usuario. Por último, se habilitan algunas funcionalidades 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 Handoff):

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

Restaurar 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 ContinueUserActivity método . 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 NSUserActivity para restaurar el estado a donde el usuario 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 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. Encuentra un restaurante en la aplicación en la que les gustaría conocer a un amigo.
  2. Si el usuario cambia a la aplicación Maps, la dirección del restaurante se sugiere automáticamente como destino.
  3. 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 automáticamente como destino allí.
  4. También proporciona contexto a Siri, por lo que el usuario puede invocar Siri dentro de la aplicación de restaurante y preguntar "Obtener indicaciones..." y Siri proporcionará instrucciones al restaurante que el usuario está viendo.

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

watchOS 3 se ha mejorado para habilitar 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.
  • La funcionalidad compatible con la ubicación se ha agregado a Siri, Maps, Multitasking y otras aplicaciones dentro del sistema.

Para implementar sugerencias basadas en ubicaciones, 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 MKMapItem actual 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 con detalle. En primer lugar, el nombre de la ubicación es necesario en cada instancia:

attributes.NamedLocation = "Apple Inc.";

A continuación, la descripción basada en texto en requerida 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 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:

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

Procedimientos recomendados de actividades

Apple sugiere los siguientes procedimientos recomendados al trabajar con actividades:

  • Se usa NeedsSave para las actualizaciones de carga diferida.
  • Asegúrese de mantener una referencia segura a la actividad actual.
  • Transfiera solo 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.

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 Maps) u otras aplicaciones de terceros.

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 existente MKDirectionsRequest 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 .
  • Ofrezca a watchOS la capacidad de aprender a sugerir la aplicación 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 del usuario a la ubicación solicitada o presentar una interfaz de usuario que facilite al usuario 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;
        }
    }
}

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

if (MKDirectionsRequest.IsDirectionsRequestUrl(url)) {

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

var request = new MKDirectionsRequest(url);

Novedad de watchOS 3, la aplicación se puede enviar una dirección que no tiene coordenadas geográficas, ya que el desarrollador debe 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 sugerencias proactivas y se ha mostrado cómo el desarrollador puede usarlas para impulsar el tráfico a una aplicación de Xamarin.iOS para watchOS. Se ha tratado el paso para implementar sugerencias proactivas y presentar instrucciones de uso.