Compartilhar via


Atualizações do SiriKit no iOS 11

O SiriKit foi introduzido no iOS 10, com vários domínios de serviço (incluindo treinos, reserva de viagens e fazer chamadas). Consulte a seção SiriKit para conhecer os 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 viagem – Adicionadas intenções de cancelamento de viagem e feedback.

Outros novos recursos incluem:

  • Nomes de aplicativos alternativos – 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 anotações 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 anotações podem ser organizadas em grupos.

Como processar uma solicitação do SiriKit

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

  1. Resolver – Valide parâmetros e solicite mais informações ao usuário (se necessário).
  2. Confirmar – Validação final e verificação de que a solicitação pode ser processada.
  3. Handle – Executar a operação (atualizar dados ou executar 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 Resolve e Confirm

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

Como 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 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 intenção específico passado para ele, que contém todas as informações que a Siri analisou a partir da solicitação do usuário (e possivelmente atualizada nos Resolve* métodos e 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ório Handle* e opcional 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 usar: 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 anotações

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 método no aplicativo para solicitar que o usuário permita interações com a INPreferences.RequestSiriAuthorization 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 > Novo Projeto....
  2. Escolha o modelo 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 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 manipular 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 está manipulando listas e anotações intenções, ele também implementa IINNotebookDomainHandling.

Observação

  • Há uma convenção no .NET para que as interfaces sejam prefixadas com maiúsculas I, que o Xamarin adere ao vincular protocolos do SDK do iOS.
  • O Xamarin também preserva nomes de tipos do iOS, e a Apple usa os dois primeiros caracteres em nomes de tipos para refletir a estrutura à qual um tipo pertence.
  • Para o framework, os Intents tipos são prefixados com IN* (ex. INExtension) mas estes não são interfaces.
  • Segue-se também que os protocolos (que se tornam interfaces em C#) acabam com dois Is, como IINAddTasksIntentHandling.

Manipulando intenções

Cada intenção (Add Task, Set Task Attribute, etc) é implementada em um único método semelhante ao mostrado abaixo. O método deve executar 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 ofereça 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 para um controlador de exibição relevante e carregar os dados da operação da Siri).

O exemplo também codifica o resultado, mas em cenários reais, o Success 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 no TasksNotes"
  • "Adicionar WWDC de tarefas à lista de treinamento no TasksNotes"
  • "Marque participar da WWDC como completo no TasksNotes"
  • "No TasksNotes lembre-me de comprar um iphone quando chegar em casa"
  • "Marcar comprar iPhone como concluído no TasksNotes"
  • "Lembre-me de sair de casa às 8h no TasksNotes"

Criar um novo exemplo de listaDefinir tarefa como exemplo completo

Observação

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

Se estiver testando em dispositivos reais, não se esqueça de configurar sua ID de 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 frases a seguir 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ê ativou o recurso Siri em seu projeto Xcode?

  • SiriKit está marcado em Entitlements.plist.

  • Entitlements.plist é configurado na assinatura de pacote iOS de compilação de opções >> do projeto.

    Opções do projeto mostrando Direitos definidos corretamente

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