Compartilhar via


Sugestões proativas do watchOS no Xamarin

Este artigo mostra como usar as Sugestões Proativas em um aplicativo watchOS 3 para gerar engajamento, permitindo que o sistema apresente proativamente informações úteis automaticamente ao usuário.

Novidade no watchOS 3, as Sugestões Proativas apresentam novas maneiras para os usuários se envolverem com um aplicativo Xamarin.iOS, apresentando proativamente informações úteis automaticamente ao usuário nos momentos apropriados.

Sobre sugestões proativas

Novo no watchOS 3, NSUserActivity inclui uma MapItem propriedade que permite que o aplicativo forneça informações de localização que podem ser usadas em outros contextos. Por exemplo, se o aplicativo exibisse avaliações de hotéis e fornecesse uma MapItem localização, se o usuário mudasse para o aplicativo Mapas, a localização do hotel que ele estava visualizando estaria disponível.

O aplicativo expõe essa funcionalidade ao sistema usando uma coleção de tecnologias como NSUserActivity, MapKit, Media Player e UIKit. Além disso, ao fornecer suporte de sugestão proativa para o aplicativo, ele obtém integração mais profunda com a Siri gratuitamente.

Sugestões baseadas em localização

Nova no watchOS 3, a NSUserActivity classe inclui uma MapItem propriedade que permite ao desenvolvedor fornecer informações de localização que podem ser usadas em outros contextos. Por exemplo, se o aplicativo exibir avaliações de restaurantes, o desenvolvedor poderá definir a MapItem propriedade para o local do restaurante que o usuário está visualizando no aplicativo. Se o usuário alternar para o aplicativo Mapas, a localização do restaurante estará automaticamente disponível.

Se o aplicativo oferecer suporte à Pesquisa de Aplicativos, ele poderá usar os CSSearchableItemAttributesSet novos componentes de endereço da classe para especificar os locais que o usuário pode querer visitar. Ao definir a MapItem propriedade, as outras propriedades são preenchidas automaticamente.

Além de definir as Latitude propriedades do componente e Longitude do endereço, é recomendável que o aplicativo forneça as NamedLocation propriedades e PhoneNumbers também, para que a Siri possa iniciar uma chamada para o local.

Lembretes contextuais da Siri

Permite que o usuário use a Siri para fazer rapidamente um lembrete para visualizar o conteúdo que está visualizando no aplicativo em uma data posterior. Por exemplo, se eles estivessem visualizando uma avaliação de restaurante no aplicativo, poderiam invocar a Siri e dizer "Lembre-me disso quando eu chegar em casa". A Siri geraria o lembrete com um link para a revisão no aplicativo.

Implementando sugestões proativas

Adicionar suporte a Sugestão Proativa ao aplicativo Xamarin.iOS normalmente é tão fácil quanto implementar algumas APIs ou expandir algumas APIs que o aplicativo já pode estar implementando.

As Sugestões Proativas funcionam com os aplicativos de três maneiras principais:

  • NSUserActivity - Ajuda o sistema a entender com quais informações o usuário está trabalhando atualmente na tela.
  • Sugestões de localização - Se o aplicativo oferecer ou consumir informações baseadas em localização, essas extensões de API oferecem novas maneiras de compartilhar essas informações entre aplicativos.

E é suportado no aplicativo implementando o seguinte:

  • Lembretes contextuais da Siri - No iOS 10, NSUserActivity foi expandido para permitir que a Siri faça rapidamente um lembrete para visualizar o conteúdo que está visualizando no aplicativo em uma data posterior.
  • Sugestões de localização - O iOS 10 aprimora NSUserActivity para capturar locais visualizados dentro do aplicativo e promovê-los em muitos lugares em todo o sistema.
  • As Solicitações - NSUserActivity contextuais da Siri fornecem contexto às informações apresentadas dentro do aplicativo para a Siri para que o usuário possa obter direções ou fazer uma chamada invocando a Siri de dentro do aplicativo.

Todos esses recursos têm uma coisa em comum, todos eles usam NSUserActivity de uma forma ou de outra para fornecer sua funcionalidade.

NSUserActivity

Como dito acima, NSUserActivity ajuda o sistema a entender com quais informações o usuário está trabalhando atualmente na tela. NSUserActivity é um mecanismo de cache de estado leve para capturar a atividade do usuário enquanto ele navega pelo aplicativo. Por exemplo, olhando para o aplicativo do restaurante:

O aplicativo do restaurante

Com as seguintes interações:

  1. À medida que o usuário trabalha com o aplicativo, um NSUserActivity é criado para recriar o estado do aplicativo posteriormente.
  2. Se o usuário pesquisar por um restaurante, o mesmo padrão de criação de atividades é seguido.
  3. E novamente, quando o usuário visualiza um resultado. Neste último caso, o usuário está visualizando um local e, no iOS 10, o sistema está mais atento a determinados conceitos (como localização ou interações de comunicação).

Dê uma olhada mais de perto na última tela:

A carga útil NSUserActivity

Aqui o aplicativo está criando um NSUserActivity e ele foi preenchido com informações para recriar o estado mais tarde. O aplicativo também incluiu alguns metadados, como nome e endereço do local. Com essa atividade criada, o aplicativo permite que o iOS saiba que ele representa o estado atual do usuário.

Em seguida, o aplicativo decide se a atividade será anunciada over-the-air para Handoff, salva como um valor temporário para sugestões de localização ou adicionada ao índice Spotlight no dispositivo para exibição nos resultados da pesquisa.

Para obter mais informações sobre a pesquisa do Handoff e do Spotlight, consulte nossos guias Introdução ao Handoff e Novas APIs de Pesquisa do iOS 9.

Criando uma atividade

Antes de criar uma Atividade, um Identificador de Tipo de Atividade precisará ser criado para identificá-la. O Identificador de Tipo de Atividade é uma cadeia de caracteres curta adicionada à NSUserActivityTypes matriz do arquivo do Info.plist aplicativo usada para identificar exclusivamente um determinado Tipo de Atividade do Usuário. Haverá uma entrada na matriz para cada atividade que o aplicativo oferece suporte e expõe à Pesquisa de Aplicativos. Consulte nossa Referência de criação de identificadores de tipo de atividade para obter mais detalhes.

Veja um exemplo de uma atividade:

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

Uma nova atividade é criada usando um Identificador de Tipo de Atividade. Em seguida, alguns metadados que definem a atividade são criados para que esse estado possa ser restaurado posteriormente. Em seguida, a atividade recebe um título significativo e é anexada às informações do usuário. Finalmente, alguns recursos são habilitados e a atividade é enviada para o sistema.

O código acima pode ser aprimorado para incluir metadados que fornecem contexto para a atividade, fazendo as seguintes alterações:

...

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

Se o desenvolvedor tiver um site capaz de exibir as mesmas informações que o aplicativo, o aplicativo poderá incluir a URL e o conteúdo poderá ser exibido em outros dispositivos que não tenham o aplicativo instalado (via Handoff):

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

Restaurando uma atividade

Para responder ao usuário tocando em um resultado de pesquisa (NSUserActivity) para o aplicativo, edite o arquivo AppDelegate.cs e substitua o ContinueUserActivity método. Por exemplo:

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

Verifique se este é o mesmo Identificador de Tipo de Atividade (com.xamarin.platform) que a atividade criada acima. O aplicativo usa as informações armazenadas no NSUserActivity para restaurar o estado de volta para onde o usuário parou.

Benefícios de criar uma atividade

Com a quantidade mínima de código apresentada acima, o aplicativo agora é capaz de aproveitar três novos recursos do iOS 10:

  • Handoff
  • Pesquisa em destaque
  • Lembretes contextuais da Siri

A seção a seguir dará uma olhada na habilitação de dois outros novos recursos do iOS 10:

  • Sugestões de Localização
  • Solicitações contextuais da Siri

Sugestões baseadas em localização

Veja o exemplo do aplicativo de pesquisa de restaurantes acima. Se ele tiver implementado NSUserActivity e preenchido corretamente todos os metadados e atributos, o usuário poderá fazer o seguinte:

  1. Encontre um restaurante no aplicativo em que eles gostariam de encontrar um amigo.
  2. Se o usuário alternar para o aplicativo Mapas, o endereço do restaurante será sugerido automaticamente como destino.
  3. Isso funciona até mesmo para aplicativos 3rd Party (que suportam NSUserActivity), para que o usuário possa mudar para um aplicativo de compartilhamento de caronas e o endereço do restaurante seja automaticamente sugerido como destino lá também.
  4. Ele também fornece contexto para a Siri, para que o usuário possa invocar a Siri dentro do aplicativo do restaurante e perguntar "Obter direções...", e a Siri fornecerá instruções para o restaurante que o usuário está visualizando.

Todas as funcionalidades acima têm uma coisa em comum, todas elas indicam de onde a sugestão vem originalmente. No caso do exemplo acima, é o aplicativo de avaliação de restaurantes fictício.

O watchOS 3 foi aprimorado para habilitar essa funcionalidade para um aplicativo por meio de várias pequenas modificações e adições às estruturas existentes:

  • NSUserActivity tem campos adicionais para capturar informações de localização que são exibidas dentro do aplicativo.
  • Várias adições foram feitas ao MapKit e CoreSpotlight para capturar a localização.
  • A funcionalidade de reconhecimento de localização foi adicionada à Siri, Mapas, Multitarefa e outros aplicativos dentro do sistema.

Para implementar sugestões baseadas em localização, comece com o mesmo código de atividade apresentado acima:

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

Se o aplicativo estiver usando o MapKit, é tão simples quanto adicionar o mapa MKMapItem atual à atividade:

// Save MKMapItem location
activity.MapItem = myMapItem;

Se o aplicativo não estiver usando o MapKit, ele poderá adotar a Pesquisa de Aplicativo e especificar os seguintes novos atributos para localização:

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

Dê uma olhada no código acima em detalhes. Primeiro, o nome do local é necessário em todas as instâncias:

attributes.NamedLocation = "Apple Inc.";

Em seguida, a descrição baseada em texto é necessária para instâncias baseadas em texto (como o teclado QuickType):

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

A latitude e a longitude são opcionais, mas certifique-se de que o usuário seja roteado para o local exato para o qual o aplicativo deseja enviá-los:

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

Ao definir os números de telefone, o aplicativo pode obter acesso à Siri para que o usuário possa invocar a Siri a partir do aplicativo dizendo algo como: *"Ligue para este lugar":

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

Finalmente, o aplicativo pode indicar se a instância é adequada para navegação e chamadas telefônicas:

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

Atividades Melhores Práticas

A Apple sugere as seguintes práticas recomendadas ao trabalhar com atividades:

  • Use NeedsSave para atualizações de carga útil preguiçosas.
  • Certifique-se de manter uma forte referência à atividade atual.
  • Transfira apenas pequenas cargas úteis que incluam apenas informações suficientes para restaurar o estado.
  • Certifique-se de que os identificadores de tipo de atividade sejam exclusivos e descritivos usando a notação DNS reverso para especificá-los.

Consumindo sugestões de localização

Esta próxima seção abordará o consumo de Sugestão de Localização que veio de outras partes do sistema (como o aplicativo Mapas) ou outros aplicativos de terceiros 3rd.

Sugestões de aplicativos e locais de roteamento

Esta seção examinará o consumo de Sugestões de Localização diretamente de um aplicativo de roteamento. Para que o aplicativo de roteamento adicione essa funcionalidade, o desenvolvedor aproveitará a estrutura existente MKDirectionsRequest da seguinte maneira:

  • Para promover o aplicativo em Multitarefa.
  • Para registrar o aplicativo como um aplicativo de roteamento.
  • Para manipular a inicialização do aplicativo com um objeto MapKit MKDirectionsRequest .
  • Dê ao watchOS a capacidade de aprender a sugerir o aplicativo com base no envolvimento do usuário.

Quando o aplicativo é iniciado com um objeto MapKit MKDirectionsRequest , ele deve começar automaticamente a dar ao usuário direções para o local solicitado ou apresentar uma interface do usuário que facilite para o usuário começar a obter direções. Por exemplo:

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

Dê uma olhada neste código em detalhes. Ele testa para ver se é uma solicitação de destino válida:

if (MKDirectionsRequest.IsDirectionsRequestUrl(url)) {

Se for, então ele cria um MKDirectionsRequest a partir da URL:

var request = new MKDirectionsRequest(url);

Novidade no watchOS 3, o app pode receber um endereço que não possui coordenadas geográficas, fazendo com que o desenvolvedor precise codificar o endereço:

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

});

Resumo

Este artigo abordou as Sugestões Proativas e mostrou como o desenvolvedor pode usá-las para direcionar o tráfego para um aplicativo Xamarin.iOS para watchOS. Ele abordou a etapa para implementar Sugestões Proativas e apresentou diretrizes de uso.