# Usando a Siri para executar atalhos no seu aplicativo Flutter através do Apple shortcuts

Fala galera, tudo blz? Hoje vamos aprender como integrar o seu app Flutter ao assistente do iOS a Siri. Recentemente precisei desenvolver um novo recurso em um aplicativo que estou trabalhando e a funcionalidade era exatamente pedir pra siri através de voz que ativasse algo no meu aplicativo.

Essa comunicação é algo bem legal e venho aqui ensinar tudo isso pra vocês.

Ao integrar os Atalhos da Siri, seu aplicativo pode destacar suas principais funcionalidades, oferecendo aos usuários maneiras novas e interativas de interagir com ele — uma estratégia simples, porém eficaz, para se manter à frente da concorrência.

# O que são Apple Shortcuts ou Atalhos

Segundo o [site](https://developer.apple.com/shortcuts/) da apple: Um *atalho* é uma maneira rápida de realizar uma ou mais tarefas com seus aplicativos economizando tempo em ações repetitivas, como definir alarmes ou lembretes. O aplicativo **Atalhos** permite que você crie seus próprios atalhos com várias etapas. Por exemplo, crie um atalho para "Tempo de Surfe" que exibe o relatório de surfe, informa o horário previsto para a praia e inicia sua playlist de músicas de surfe.

Os Shortcuts ficam disponíveis assim que o aplicativo é instalado no iOS e podem ser executados no Spotlight, na tela Inicial, no aplicativo Atalhos ou até mesmo usando a voz com a **Siri** que é o que vamos fazer hoje.

E para fazermos o nosso aplicativo Flutter comunicar com os Atalhos do iOS vamos usar algo chamado [App Intents](https://developer.apple.com/documentation/AppIntents) que oferece funcionalidades para integrar profundamente as ações e o conteúdo do seu aplicativo com as experiências do sistema em todas as plataformas, incluindo Siri, Spotlight, widgets, controles e muito mais.

# Utilizando as Intents no Flutter **com o package** Intelligence

### 1 — Adicionando a dependência em seu projeto

Vamos começar adicionando a dependência ao nosso arquivo `pubspec.yaml.`

Instale o pacote a partir da linha de comando com o Flutter

```bash
$ flutter pub add intelligence
```

Ou adicione `intelligence` diretamente em seu `pubspec.yaml` e execute `flutter pub get` no momento da criação desse artigo ele está na versão **0.2.0.**

```dart
dependencies:
  intelligence: ^0.2.0
```

Agora, no seu código Dart, você pode importar o package:

```dart
import 'package:intelligence/intelligence.dart';
```

### 2 - Vamos criar um novo aplicativo Flutter para o nosso exemplo de hoje.

```bash
flutter create flutter_siri_example
```

Após o nosso projeto criado vamos fazer a configuração na parte nativa do iOS, então abra a pasta `ios` no **Xcode** clicando com o botão direito no vsCode.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1747316853995/56c60ac9-355b-4021-8781-14092a0117c8.png align="center")

Agora você precisa definir a versão mínima do iOS para 16.0 no Xcode para o projeto, veja a imagem abaixo:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1747316562362/b5d98f0b-eebc-4eeb-8611-a8a4cc6ea545.png align="center")

Após feito isso vamos integrar os comandos que queremos que a siri interprete em nosso aplicativo.

Abra o Xcode e crie uma novo arquivo Swift. Vamos usar o exemplo padrão do Flutter de app contador e adicionar dois comandos, um para **incrementar** e outro para **resetar** o valor.

Crie o arquivo `IncrementeIntent.Swift` no Xcode, veja o exemplo abaixo e código que você precisa escrever.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1747576729848/559326cf-3217-4c70-825e-89a98c88d672.png align="center")

```swift
import AppIntents
import intelligence

struct IncrementIntent: AppIntent {
  static var title: LocalizedStringResource = "Aumentar contador"
  static var openAppWhenRun: Bool = true
  
  @MainActor
  func perform() async throws -> some IntentResult {
    IntelligencePlugin.notifier.push("increment")
    return .result()
  }
}
```

Vamos criar nossa segunda Intent onde vai interpretar o comando de reset do valores do contador.

Crie um arquivo chamado `RefreshIntent.Swfit` conforme a imagem abaixo:

![Xcode](https://cdn.hashnode.com/res/hashnode/image/upload/v1747576907353/6448a7b8-23b3-4b1d-9efb-4a454b8db102.png align="center")

```swift
import AppIntents
import intelligence

struct RefreshIntent: AppIntent {
  static var title: LocalizedStringResource = "Atualizar contador"
  static var openAppWhenRun: Bool = true
  
  @MainActor
  func perform() async throws -> some IntentResult {
    IntelligencePlugin.notifier.push("refresh")
    return .result()
  }
}
```

Em seguida vamos criar último arquivo para interpretar as strings dos comandos e acionar a Intent correta declarado acima apenas falando uma frase específica para a Siri.

Veja o exemplo abaixo:

![Xcode](https://cdn.hashnode.com/res/hashnode/image/upload/v1747577125756/8c665676-aefa-4883-bc16-db2bc3f88e7a.png align="center")

```swift
import AppIntents

struct AllAppShortcuts: AppShortcutsProvider {
    static var appShortcuts: [AppShortcut] {
       return [
            AppShortcut(
                intent: IncrementIntent(),
                phrases: [
                    "Incrementar número no \(.applicationName)",
                    "Adicionar número no \(.applicationName)",
                    "Aumentar número no \(.applicationName)",
                
                ]
            ),
            AppShortcut(
                intent: RefreshIntent(),
                phrases: [
                    "Resetar contador no \(.applicationName)"
                ]
            ),
        ]
    }
}
```

### Agora o lado do Flutter 💙

No lado do Flutter na nossa página principal vamos chamar o método para escutar se o aplicativo foi aberto pela a Siri e interpretando os comandos.

```dart
 void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  void _refreshCounter() {
    setState(() {
      _counter = 0;
    });
  }

  @override
  void initState() {
    super.initState();
    _initSiri();
  }

  void _initSiri() {
    if (Platform.isIOS) {
      Intelligence().selectionsStream().listen(_trackSiri);
    }
  }

  void _trackSiri(String selection) {
    log('Siri Command triggered: $selection');
    switch (selection) {
      case 'increment':
        _incrementCounter();
        break;
      case 'refresh':
        _refreshCounter();
        break;

      default:
        break;
    }
  }
```

O código acima é responsável por ouvir os comandos passados para a Siri e acionar os métodos corretos que no nosso caso são dois em nosso app.

`_incrementCounter` e `_refreshCounter` o resto do código você pode consultar no link do repositório [aqui](https://github.com/iang12/flutter_siri_example).

# Rodando e testando o aplicativo

Execute o aplicativo no simulador do iOS e ative a Siri com a opção mostrada abaixo:

![Vs Code](https://cdn.hashnode.com/res/hashnode/image/upload/v1747657076652/775b1054-ba85-4c10-9f40-b97c8188b94f.png align="center")

Quando a Siri detectar pela primeira vez o comando de voz, pode ser que o iOS peça para adicionar o comando no app Atalhos do iOS mas nos meus testes teve vez que foi automático mas se aparecer apenas clique em **Ativar**.

![Apple Shortcuts no iOS](https://cdn.hashnode.com/res/hashnode/image/upload/v1747658897621/5e5eb5ef-bbd2-4210-93d5-160fa368fe47.png align="center")

Veja o link do video do aplicativo de demonstração em funcionamento abaixo: 👇🏻

[https://drive.google.com/file/d/1CddUVKZt8iCdSNgNx7Z\_oLPSNrGQOk5C/view?usp=sharing](https://drive.google.com/file/d/1CddUVKZt8iCdSNgNx7Z_oLPSNrGQOk5C/view?usp=sharing)

# **Conclusão ✅**

Bom foi isso, os atalhos da Siri podem automatizar diversas tarefas, como iniciar aplicativos, enviar mensagens, definir lembretes e deixar nossos apps muito mais inteligentes e legais. O céu é o limite ✨

Você pode consultar o código de exemplo no [github](https://github.com/iang12/flutter_siri_example).

Obrigado por ler até aqui. 😁

Espero que você tenha gostado! Compartilhe-o com seus amigos e colegas!

Juntos, vamos construir apps incríveis que transformam o mundo!

Se tiver alguma dúvida ou contribuição me manda uma DM ou deixe nos comentários!

Me siga para estar sempre por dentro dos próximos artigos sobre desenvolvimento móvel 📲 🚀

# **🌐 Minhas redes sociais 🌐**

[**Github**](https://www.github.com/iang12) | [**LinkedIn**](https://www.linkedin.com/in/ian-oliveira-0701a2130/) | [**Instagram**](https://www.instagram.com/ianoliveira.dev/) | [**X (Twitter)**](https://x.com/ianoliveirag12) | [**Medium**](https://medium.com/@ianoliveirag12)
