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.
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:
- Resolver – Valide os parâmetros e solicite mais informações do usuário (se necessário).
- Confirmar – validação final e verificação de que a solicitação pode ser processada.
- 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 osHandle*
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 umConfirm*
método, mas não de umHandle*
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 umHandle*
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:
- Marque SiriKit em Entitlements.plist.
- Adicione a chave Privacidade – Descrição de uso da Siri ao Info.plist, juntamente com uma mensagem para seus clientes.
- Chame o
INPreferences.RequestSiriAuthorization
método no aplicativo para solicitar que o usuário permita interações com a Siri. - 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:
- Clique com o botão direito do mouse em sua solução e escolha Adicionar > Adicionar Novo Projeto....
- Escolha o modelo de extensão de intenções de extensão do iOS > >.
- 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 ,
I
que 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 comIN*
(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
I
s, comoIINAddTasksIntentHandling
.
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:
- 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 opcionaisResolve*
. - 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.
- 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"
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:
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.
(para implantação de dispositivo) A ID do aplicativo tem o SiriKit habilitado e o perfil de provisionamento baixado.