Construindo uma aplicação de lista de tarefas habilitadas por voz no iOS com integração Siri

O controle de voz tornou-se uma expectativa fundamental em aplicativos de produtividade modernos. Ao permitir que os usuários gerenciem tarefas sem mãos, os desenvolvedores iOS podem criar uma experiência de lista de tarefas significativamente mais acessível e eficiente. Siri, assistente de voz inteligente da Apple, fornece uma estrutura robusta para integrar comandos de voz diretamente em seu aplicativo. Este guia o orienta através de cada etapa de criação de um aplicativo de lista de tarefas habilitado para voz, desde a configuração inicial do projeto até as melhores práticas de manipulação avançada de intenção e implantação. Se você é um desenvolvedor iOS experiente ou novo para SiriKit, as técnicas descritas aqui irão ajudá-lo a adicionar interações de voz poderosas e de linguagem natural ao seu aplicativo.

Compreender o SiriKit e o seu papel na gestão de tarefas

O SiriKit é uma estrutura que permite que o seu aplicativo estenda a sua funcionalidade ao Siri. Em vez de criar uma interface de voz separada, você define as ações que os usuários podem executar através de comandos de voz e o Siri lida com reconhecimento de fala e processamento de linguagem natural. Para uma aplicação de lista de tarefas, o SiriKit permite ações como adicionar uma tarefa, remover uma tarefa, mostrar tarefas atuais ou até mesmo marcar uma tarefa como completa.

O framework usa intents — objetos que representam ações do usuário. Seu aplicativo define intenções personalizadas para as operações específicas que suporta. Quando um usuário fala um comando como “Ei Siri, adicione leite à minha lista de compras no MyToDoApp”, Siri corresponde à frase com sua intenção, extrai parâmetros (como o nome da tarefa e identificador da lista), e entrega a intenção ao manipulador do aplicativo. Seu aplicativo então executa a ação e retorna uma resposta. Siri usa essa resposta para confirmar o resultado ao usuário.

Os principais benefícios de usar o SiriKit incluem:

  • Operação sem mãos: Os usuários podem gerenciar tarefas durante a condução, cozinha ou exercício.
  • A acessibilidade aumentada: O controle de voz ajuda os usuários com deficiências motoras ou visuais.
  • Consistência com interações de voz do sistema: Seu aplicativo parece um cidadão iOS de primeira classe.
  • Integração de atalho: Os usuários podem criar atalhos Siri personalizados para ações frequentemente usadas.

SiriKit vs. Outras Soluções de Voz

Você pode se perguntar se deve usar o SiriKit, reconhecimento de fala personalizado (através da estrutura de fala), ou um serviço de terceiros como o Google Speech-to-Text. O SiriKit é a abordagem recomendada para integrar-se com o assistente do sistema, porque não requer nenhuma gravação de áudio separada UI, nenhuma configuração de reconhecimento de fala, e funciona em dispositivos Apple. O Framework Speech é mais adequado para aplicativos que precisam processar fluxos de áudio arbitrários (por exemplo, transcrição). Para uma aplicação de lista de tarefas onde você só precisa de um conjunto fixo de comandos, o SiriKit é o vencedor claro.

Configurando seu projeto para integração com Siri

A criação de uma aplicação habilitada para voz começa com a configuração normal do projecto Xcode. Também terá de activar a capacidade do Siri e adicionar uma extensão Intents para lidar com pedidos, mesmo quando o aplicativo não estiver em execução.

Passo 1: Criar um Novo Projeto Xcode

Inicie o Xcode e crie um novo projeto usando o modelo App (iOS). Dê ao seu projeto um nome, como VoiceTodo, e garanta que SwiftUI ou UIKit está selecionado com base na sua preferência. Salve o projeto.

Passo 2: Habilitar a capacidade Siri

Na página do seu destino de aplicação Assinar e Capacidades, clique no botão + Capacidade[ e procure Siri. Adicione a capacidade e certifique-se de que a caixa de seleção está selecionada. Este passo é obrigatório; sem isso, Siri não reconhecerá suas intenções.

Passo 3: Adicionar uma Extensão de Intenção

Para permitir que o Siri lide com as intenções, mesmo quando o seu aplicativo estiver em segundo plano ou não lançado, você precisa de um Extensão Intendências. Vá para Arquivo > Novo > Alvo, selecione Extensão Intendências[] sob a seção “Extensão de Aplicação”, e nomeie-o (por exemplo, ]VoiceTodoIntents). O Xcode criará um alvo separado com o seu próprio arquivo Info.plist e . Na Info.plist da extensão, verifique se o IntentsSpoportado] array está presente e contém os nomes das suas intenções personalizadas (que definiremos a seguir).

Passo 4: Criar um Arquivo de Definição de Intenções

No seu alvo principal, crie um novo arquivo usando o template Intents Definition] (encontrado em Modelos de Recursos). Nomeie-o TodoIntents.intents definition. Este arquivo é onde você define suas intenções personalizadas. Ele será automaticamente compartilhado com seu alvo de Extensão de Intenções se você configurá- lo corretamente.

Para garantir que o arquivo de definição esteja disponível para ambos os alvos, selecione o arquivo TodoIntents.intentivedefinition no navegador do projeto e, no Inspetor de Arquivo, adicione tanto o aplicativo principal quanto a Extensão de Intenções à lista de membros de alvo . Este passo é muitas vezes negligenciado, mas é crítico para gerar as classes Swift necessárias.

Definir Intenções Personalizadas para Operações Por Fazer

Com o arquivo Definição de Intenções pronto, você pode agora criar as intenções específicas que irão ativar seus comandos de voz. Para uma aplicação básica para fazer lista, você vai querer pelo menos três intenções: AdicionarIntendência de Tarefa, RemoverIntendência de Tarefa[, e [ MostrarIntendência de Tarefa[].

Criando o AdicionarIntentivo de Tarefa

  1. Abrir TodoIntents.intentivedefinition. Clique no + no canto inferior esquerdo da tela e selecione Nova Intenção.
  2. Nome da intenção .
  3. Em Parâmetros, adicione um novo parâmetro chamado do tipo String[. Opcionalmente, adicione um parâmetro se seu aplicativo suporta várias listas.
  4. Defina o nome da exibição (por exemplo, “Nome da tarefa”) e Prompt[] (por exemplo, “Que tarefa devo adicionar?”). Este prompt aparece quando Siri precisa de esclarecimento.
  5. Na seção Response, escolha Sucesso e defina um modelo de resposta como “Added {{taskName}}} à sua lista de tarefas.”
  6. Verifique se A classe personalizada está verificada e o nome da classe é .

Criando o Conteúdo da Remover a Tarefa

Repita o processo para um com um parâmetro . A resposta pode ser “Removida {{taskName}}” ou “{{taskName}}} não foi encontrada.” Você também pode adicionar um tipo de resposta Falha para quando a tarefa não existir.

Criando o ShowTasksIntent

Para , você pode não precisar de quaisquer parâmetros. Em vez disso, confie na resposta para conter uma lista de tarefas. Na seção de resposta, adicione uma propriedade Content do tipo String. Use um modelo de resposta como “Você tem {{conunt} tarefas: {{content}}”. A propriedade pode ser uma propriedade personalizada definida programáticamente.

Gerando Classes de Intenção

Depois de definir todas as intenções, componha o seu projeto. O Xcode irá gerar automaticamente classes Swift para cada intenção e sua resposta. Estas classes estão ao vivo na pasta [[FLT: 0]]DerivedData, mas estão visíveis no editor. Você irá usá- las no seu código de tratamento.

Implementação de Manuseamento de Intenção em sua Aplicação e Extensão

Agora que as intenções são definidas, você precisa escrever o código que as trata quando Siri invocar seu aplicativo.

Manuseamento de Intenções na Extensão de Intenção

O alvo Extensão de Intenção inclui um arquivo padrão . Abra-o e substitua seu conteúdo por uma classe que se conforme aos protocolos de manipulação de intenção gerados. Cada intenção terá seu próprio método de manipulação.

import Intents

class IntentHandler: INExtension, AddTaskIntentHandling, RemoveTaskIntentHandling, ShowTasksIntentHandling {

 override func handler(for intent: INIntent) -> Any? {
 return self
 }

 // MARK: - Add Task
 func handle(intent: AddTaskIntent, completion: @escaping (AddTaskIntentResponse) -> Void) {
 guard let taskName = intent.taskName else {
 completion(AddTaskIntentResponse.failure(taskName: "unknown"))
 return
 }
 // Persist the task to your data store (Core Data, UserDefaults, etc.)
 // For simplicity, we'll assume a shared data manager
 TaskDataManager.shared.addTask(taskName: taskName, listName: intent.listName ?? "Default")
 completion(AddTaskIntentResponse.success(taskName: taskName))
 }

 func resolveTaskName(for intent: AddTaskIntent, with completion: @escaping (INStringResolutionResult) -> Void) {
 if let taskName = intent.taskName, !taskName.isEmpty {
 completion(.success(with: taskName))
 } else {
 // Prompt user for a task name
 completion(.needsValue())
 }
 }

 // MARK: - Remove Task
 func handle(intent: RemoveTaskIntent, completion: @escaping (RemoveTaskIntentResponse) -> Void) {
 guard let taskName = intent.taskName else {
 completion(.failure(taskName: "unknown"))
 return
 }
 let removed = TaskDataManager.shared.removeTask(taskName: taskName)
 if removed {
 completion(.success(taskName: taskName))
 } else {
 completion(.notFound(taskName: taskName))
 }
 }

 // MARK: - Show Tasks
 func handle(intent: ShowTasksIntent, completion: @escaping (ShowTasksIntentResponse) -> Void) {
 let tasks = TaskDataManager.shared.allTasks()
 let taskList = tasks.map { $0.name }.joined(separator: ", ")
 let count = tasks.count
 let response = ShowTasksIntentResponse.success(count: count, content: taskList)
 completion(response)
 }
}

Armazenagem de dados compartilhada

O código acima faz referência a um hipotético . Como a Extensão de Intenções é executada em um processo separado, você não pode acessar diretamente o modelo de dados principal do seu aplicativo. Você precisa usar um recipiente compartilhado (Grupo de aplicativos) para armazenar tarefas em um local comum, como um pacote compartilhado UserDefaults[] ou uma loja de dados Core que vive no diretório do grupo de aplicativos. Configure uma capacidade do Grupo de Aplicativos em seu aplicativo principal e na Extensão de Intenções, e use o mesmo identificador para persistir nas tarefas.

Manuseamento de Intenções na Aplicação Principal

Quando o seu aplicativo estiver na frente e o usuário ativar um atalho Siri, você também pode querer lidar com as intenções diretamente no aplicativo principal (sem a extensão). Você pode conformar seu delegado de aplicativo ou delegado de cena com os mesmos protocolos de intenção. No entanto, para a maioria dos casos de uso, a extensão é suficiente porque funciona independentemente de se o aplicativo está no primeiro plano.

Funcionalidade Expandida: Confirmação, Desfazer e Parâmetros

O tratamento básico de intenção é apenas o início. Para tornar a sua lista de tarefas activada por voz robusta, adicione suporte para diálogos de confirmação e resolução de parâmetros.

Métodos de resolução

Para cada parâmetro, você pode implementar um método que valida ou pede esclarecimentos. Por exemplo, se o usuário diz “Adicionar ovos” sem especificar qual lista, seu método pode solicitar: “Qual lista você deseja adicionar ovos?” Se você só tem uma lista, resolva automaticamente para essa lista.

Respostas de Confirmação

Você pode deixar Siri pedir ao usuário para confirmar uma ação antes de executá- la. Isto é útil para operações destrutivas como remover tarefas. Na sua classe de resposta de intenção, adicione um tipo de resposta Confirmação. Ao lidar com a intenção, você pode retornar uma resposta de confirmação que inclui os detalhes. Siri então pedirá ao usuário para confirmar, e se confirmado, seu método será chamado novamente com uma bandeira.

Tratamento de URLs para ligação profunda

Após executar uma ação, você pode querer abrir seu aplicativo para mostrar a lista atualizada. Seu manipulador de intenção pode chamar se disponível, ou seu aplicativo principal pode responder a esquemas de URL. Adicione uma propriedade para sua definição de intenção para habilitar a ligação profunda automática.

Testando sua aplicação habilitada por voz

A integração com o Siri requer alguma configuração, porque os comandos falados não podem ser simulados diretamente. Use as seguintes abordagens:

Usando o Simulador Siri no Xcode

Execute a sua aplicação principal num simulador e depois pare a aplicação. Em seguida, execute o alvo de Extensão de Intenção com um esquema configurado para o simulador. O Xcode irá iniciar uma interface Siri simulada onde poderá escrever o seu comando. Esta é a forma mais rápida de testar sem um dispositivo físico.

Testando com um dispositivo real

Para reconhecimento preciso das suas intenções específicas, teste num dispositivo iOS real que execute o iOS 14 ou posterior. Depois de instalar a sua aplicação, abra a opção Configuração > Siri & Procure o > MyToDoApp e assegure- se de que as intenções estão ativadas. Diga “Ei, Siri, adicione o código de escrita à minha lista de tarefas no MyToDoApp” e verifique o resultado.

Problemas comuns e depuração

  • Intenção não reconhecida: Verificar que o Info.plist da Extensão de Intenções inclui os nomes de classes de intenção em IntençãoSuportada.
  • Dados não compartilhados: Garantir que ambos os alvos pertencem ao mesmo Grupo de aplicativos e que o caminho do armazenamento de dados está correto.
  • Responda não falada: Use modelos de resposta que incluam variáveis ; Siri lê-as em voz alta.
  • Perdendo parâmetro:] Implementar métodos de resolução para lidar com entradas ambíguas.

Implantação e Considerações da Loja de Aplicações

Ao enviar a sua aplicação para a App Store, deverá declarar a capacidade do Siri. Na App Store Connect, adicione uma nota nas notas de revisão explicando o que as suas intenções fazem e forneça comandos de teste. A Apple irá provavelmente testar com um dispositivo real, por isso assegure-se de que tudo funciona correctamente.

Para maximizar a adoção do usuário, considere as seguintes melhores práticas:

  • Usuários onboard: Mostre um breve tutorial sobre comandos de voz disponíveis quando o aplicativo for lançado pela primeira vez.
  • Atalhos de suporte:Permite aos utilizadores criar atalhos vocais personalizados para tarefas específicas (por exemplo, “Ei Siri, adicione mantimentos”) via e .
  • Localize suas intenções: Fornecer alertas localizados e modelos de resposta para diferentes idiomas.
  • Erros de mão graciosamente: Sempre retorna uma resposta significativa — mesmo que a tarefa não dê certo — para orientar o usuário.

Recursos Avançados e Passos Próximos

Uma vez que você tenha a lista de tarefas habilitada para voz base funcionando, você pode extendê-la com:

  • Análise da data da linguagem natural:Digamos aos utilizadores “Adicionar leite de compra para amanhã” e definamos automaticamente uma data de vencimento com .
  • Suporte de grupo e tag: Adicionar parâmetros para categorias como ou .
  • Integração interaplicativa: Use o [Workout, Media, ou outros domínios se o seu aplicativo se expandir para além de listas de tarefas.
  • Vocabulário personalizado: Fornecer uma lista de vocabulário para treinar Siri para reconhecer frases específicas de aplicativos como “minha lista de compras” ou “tarefas de trabalho”.

Conclusão

Construir uma aplicação de lista de tarefas com voz habilitada com integração Siri é uma forma prática de melhorar a produtividade e acessibilidade do usuário. Ao definir intenções personalizadas, implementar manipuladores em uma extensão dedicada e usar uma loja de dados compartilhada, você pode criar uma experiência perfeita sem mãos. Os passos descritos neste guia — desde a configuração do projeto até os testes e submissão — lhe dão uma base sólida. À medida que a interação de voz se torna mais prevalente, adicionar integração Siri ao seu aplicativo irá defini-lo na App Store. Comece a experimentar com o SiriKit hoje e deixe seus usuários gerenciarem suas tarefas tão facilmente quanto falar.

Para mais detalhes, consulte o guia oficial da Apple Documentação do SiriKit e o Guia de atalhos. Se você é novo no desenvolvimento do iOS, também reveja Iniciar o desenvolvimento de aplicativos iOS (Swift)[ para conceitos de fundação.