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.
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:
- Resolver – Valide parâmetros e solicite mais informações ao usuário (se necessário).
- Confirmar – Validação final e verificação de que a solicitação pode ser processada.
- 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 osHandle*
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 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 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:
- 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 método no aplicativo para solicitar que o usuário permita interações com a
INPreferences.RequestSiriAuthorization
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 > Novo Projeto....
- Escolha o modelo 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 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 comIN*
(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
I
s, comoIINAddTasksIntentHandling
.
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:
- 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 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"
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:
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.
(para implantação de dispositivo) A ID do aplicativo tem o SiriKit habilitado e o perfil de provisionamento baixado.