Partilhar via


Atualizações do SiriKit no iOS 11

O SiriKit foi introduzido no iOS 10, com vários domínios de serviço (incluindo exercícios, reserva de viagens e chamadas). Consulte a seção SiriKit para conceitos do SiriKit e como implementar o SiriKit em seu aplicativo.

Demonstração da lista de tarefas da Siri

O SiriKit no iOS 11 adiciona estes domínios de intenção novos e atualizados:

  • Listas e notas - Novo! Fornece uma API para aplicativos processarem tarefas e anotações.
  • Códigos visuais – Novo! A Siri pode exibir códigos QR para compartilhar informações de contato ou participar de transações de pagamento.
  • Pagamentos – Adicionadas intenções de pesquisa e transferência para interações de pagamento.
  • Reserva de carona – Adicionadas intenções de cancelamento de viagem e feedback.

Outros novos recursos incluem:

  • Nomes alternativos de aplicativos – Fornece aliases que ajudam os clientes a dizer à Siri para segmentar seu aplicativo, oferecendo nomes/pronúncias alternativos.
  • Iniciando treinos – Fornece a capacidade de iniciar um treino em segundo plano.

Alguns desses recursos são explicados abaixo. Para obter mais detalhes sobre os outros, consulte a documentação do SiriKit da Apple.

Listas e notas

O novo domínio de listas e notas fornece uma API para que os aplicativos processem tarefas e notas por meio de solicitações de voz da Siri.

Tarefas

  • Ter um título e um status de conclusão.
  • Opcionalmente, inclua um prazo e um local.

Observações

  • Tenha um título e um campo de conteúdo.

Tanto as tarefas quanto as notas podem ser organizadas em grupos.

Como processar uma solicitação do SiriKit

Processe uma solicitação do SiriKit seguindo estas etapas:

  1. Resolver – Valide os parâmetros e solicite mais informações do usuário (se necessário).
  2. Confirmar – validação final e verificação de que a solicitação pode ser processada.
  3. Handle – Execute a operação (atualizando dados ou executando operações de rede).

As duas primeiras etapas são opcionais (embora incentivadas) e a etapa final é necessária. Há instruções mais detalhadas na seção SiriKit.

Métodos de resolução e confirmação

Esses métodos opcionais permitem que seu código execute validação, selecione padrões ou solicite informações adicionais do usuário.

Por exemplo, para a IINCreateTaskListIntent interface, o método necessário é HandleCreateTaskList. Há quatro métodos opcionais que fornecem mais controle sobre a interação da Siri:

  • ResolveTitle – Valida o título, define um título padrão (se apropriado) ou sinaliza que os dados não são necessários.
  • ResolveTaskTitles – Valida a lista de tarefas faladas pelo usuário.
  • ResolveGroupName – Valida o nome do grupo, escolhe um grupo padrão ou sinaliza que os dados não são necessários.
  • ConfirmCreateTaskList – Valida que seu código pode executar a operação solicitada, mas não a executa (apenas os métodos devem modificar os Handle* dados).

Lidar com a intenção

Há seis intenções no domínio de listas e notas, três para tarefas e três para notas. Os métodos que você deve implementar para lidar com essas intenções são:

  • Para tarefas:
    • HandleAddTasks
    • HandleCreateTaskList
    • HandleSetTaskAttribute
  • Para observações:
    • HandleCreateNote
    • HandleAppendToNote
    • HandleSearchForNotebookItems

Cada método tem um tipo de intent específico passado para ele, que contém todas as informações que a Siri analisou da solicitação do usuário (e possivelmente atualizadas nos Resolve* métodos and Confirm* ). Seu aplicativo deve analisar os dados fornecidos, executar algumas ações para armazenar ou processar os dados e retornar um resultado que a Siri fala e mostra ao usuário.

Códigos de resposta

Os métodos obrigatórios Handle* e opcionais Confirm* indicam um código de resposta definindo um valor no objeto que eles passam para o manipulador de conclusão. As respostas vêm da INCreateTaskListIntentResponseCode enumeração:

  • Ready – Retorna durante a fase de confirmação (ou seja, de um Confirm* método, mas não de um Handle* método).
  • InProgress – Usado para tarefas de longa duração (como uma operação de rede/servidor).
  • Success – Responde com os detalhes da operação bem-sucedida (apenas a partir de um Handle* método).
  • Failure – Significa que ocorreu um erro e a operação não pôde ser concluída.
  • RequiringAppLaunch – Não pode ser processado pela intenção, mas a operação é possível no aplicativo.
  • Unspecified – Não use: a mensagem de erro será exibida para o usuário.

Saiba mais sobre esses métodos e respostas na documentação de listas e notas do SiriKit da Apple.

Implementando listas e notas

Primeiro, para adicionar suporte ao SiriKit, siga estas etapas para seu aplicativo iOS:

  1. Marque SiriKit em Entitlements.plist.
  2. Adicione a chave Privacidade – Descrição de uso da Siri ao Info.plist, juntamente com uma mensagem para seus clientes.
  3. Chame o INPreferences.RequestSiriAuthorization método no aplicativo para solicitar que o usuário permita interações com a Siri.
  4. Adicione o SiriKit à ID do Aplicativo no Portal do Desenvolvedor e recrie seus perfis de provisionamento para incluir o novo direito.

Em seguida, adicione um novo projeto de extensão ao seu aplicativo para lidar com solicitações da Siri:

  1. Clique com o botão direito do mouse em sua solução e escolha Adicionar > Adicionar Novo Projeto....
  2. Escolha o modelo de extensão de intenções de extensão do iOS > >.
  3. Dois novos projetos serão adicionados: Intent e IntentUI. A personalização da interface do usuário é opcional, portanto, o exemplo inclui apenas o código no projeto Intent .

O projeto de extensão é onde todas as solicitações do SiriKit serão processadas. Como uma extensão separada, ele não tem automaticamente nenhuma maneira de se comunicar com seu aplicativo principal – isso geralmente é resolvido implementando o armazenamento de arquivos compartilhados usando grupos de aplicativos.

Configurar o IntentHandler

A IntentHandler classe é o ponto de entrada para solicitações da Siri – cada intenção é passada para o GetHandler método, que retorna um objeto que pode lidar com a solicitação.

O código abaixo mostra uma implementação simples:

[Register("IntentHandler")]
public partial class IntentHandler : INExtension, IINNotebookDomainHandling
{
  protected IntentHandler(IntPtr handle) : base(handle)
  {}
  public override NSObject GetHandler(INIntent intent)
  {
    // This is the default implementation.  If you want different objects to handle different intents,
    // you can override this and return the handler you want for that particular intent.
    return this;
  }
  // add intent handlers here!
}

A classe deve herdar de INExtension, e como o exemplo vai lidar com listas e observações de intenções, ele também implementa IINNotebookDomainHandling.

Observação

  • Há uma convenção no .NET para que as interfaces sejam prefixadas com um , Ique o Xamarin adere ao associar protocolos do SDK do iOS.
  • O Xamarin também preserva nomes de tipo do iOS, e a Apple usa os dois primeiros caracteres em nomes de tipo para refletir a estrutura à qual um tipo pertence.
  • Para a estrutura, os Intents tipos são prefixados com IN* (por exemplo, INExtension), mas não são interfaces.
  • Também se segue que os protocolos (que se tornam interfaces em C#) terminam com dois Is, como IINAddTasksIntentHandling.

Manipulando intenções

Cada intent (Adicionar Tarefa, Definir Atributo de Tarefa, etc.) é implementada em um único método semelhante ao mostrado abaixo. O método deve desempenhar três funções principais:

  1. Processar a intenção – Os dados analisados pela Siri são disponibilizados em um intent objeto específico para o tipo de intenção. Seu aplicativo pode ter validado esses dados usando métodos opcionais Resolve* .
  2. Validar e atualizar o armazenamento de dados – Salve os dados no sistema de arquivos (usando grupos de aplicativos para que o aplicativo iOS principal também possa acessá-los) ou por meio de uma solicitação de rede.
  3. Fornecer resposta – Use o completion manipulador para enviar uma resposta de volta à Siri para ler/exibir para o usuário:
public void HandleCreateTaskList(INCreateTaskListIntent intent, Action<INCreateTaskListIntentResponse> completion)
{
  var list = TaskList.FromIntent(intent);
  // TODO: have to create the list and tasks... in your app data store
  var response = new INCreateTaskListIntentResponse(INCreateTaskListIntentResponseCode.Success, null)
  {
    CreatedTaskList = list
  };
  completion(response);
}

Observe que null é passado como o segundo parâmetro para a resposta – este é o parâmetro de atividade do usuário e, quando não for fornecido, um valor padrão será usado. Você pode definir um tipo de atividade personalizado, desde que seu aplicativo iOS dê suporte a ele por meio da NSUserActivityTypes chave em Info.plist. Em seguida, você pode lidar com esse caso quando seu aplicativo é aberto e executar operações específicas (como abrir em um controlador de exibição relevante e carregar os dados da operação da Siri).

O exemplo também codifica o Success resultado, mas em cenários reais, o relatório de erros adequado deve ser adicionado.

Frases de teste

As seguintes frases de teste devem funcionar no aplicativo de exemplo:

  • "Faça uma lista de compras com maçãs, bananas e peras no TasksNotes"
  • "Adicionar tarefa WWDC em TasksNotes"
  • "Adicionar tarefa WWDC à lista de treinamento em TasksNotes"
  • "Marcar a participação na WWDC como concluída em TasksNotes"
  • "No TasksNotes me lembre de comprar um iphone quando eu chegar em casa"
  • "Marcar comprar iPhone como concluído em TasksNotes"
  • "Lembre-me de sair de casa às 8h em TasksNotes"

Criar um novo exemplo de lista Definir tarefa como exemplo completo

Observação

O Simulador do iOS 11 oferece suporte a testes com Siri (ao contrário das versões anteriores).

Se estiver testando em dispositivos reais, não se esqueça de configurar sua ID do aplicativo e perfis de provisionamento para suporte ao SiriKit.

Nomes alternativos

Esse novo recurso do iOS 11 significa que você pode configurar nomes alternativos para seu aplicativo para ajudar os usuários a acioná-lo corretamente com a Siri. Adicione as seguintes chaves ao arquivo Info.plist do projeto de aplicativo iOS:

Info.plist mostrando chaves e valores de nome de aplicativo alternativos

Com os nomes de aplicativos alternativos definidos, as seguintes frases também funcionarão para o aplicativo de exemplo (que, na verdade, é chamado de TasksNotes):

  • "Faça uma lista de compras com maçãs, bananas e peras no MonkeyNotes"
  • "Adicionar tarefa WWDC no MonkeyTodo"

Solução de problemas

Alguns erros que você pode encontrar ao executar o exemplo ou adicionar o SiriKit aos seus próprios aplicativos:

NSInternalInconsistencyException

Objective-C exceção lançada. Nome: NSInternalInconsistencyException Motivo: O uso da classe <INPreferences: 0x60400082ff00> de um aplicativo requer o direito com.apple.developer.siri. Você habilitou o recurso Siri em seu projeto Xcode?

  • O SiriKit está marcado em Entitlements.plist.

  • Entitlements.plist é configurado nas opções > do projeto Criar > assinatura de pacote do iOS.

    Opções de projeto mostrando direitos definidos corretamente

  • (para implantação de dispositivo) A ID do aplicativo tem o SiriKit habilitado e o perfil de provisionamento baixado.