Notificações push
Quando o atendente, a IA ou o sistema responde e o cliente está fora do chat, a Atalia avisa o aparelho. O toque na notificação abre o chat direto na conversa.

Ligue no painel como explicado aqui. A preparação do projeto (bibliotecas, app.json, permissão e código) está em React Native e Expo.
Quem faz o quê
A Atalia decide quando notificar e monta a notificação. A entrega vai por um de dois caminhos, que você escolhe no painel.
| Etapa | A Atalia | O seu app |
|---|---|---|
| Decidir se avisa | Só com o cliente fora do chat. Junta uma sequência de mensagens numa notificação só. Nunca manda a mesma mensagem duas vezes. | |
| Montar a notificação | Título (nome do atendente ou do atendimento), texto, número no ícone e os dados para abrir a conversa. | |
| Entregar | Pelo Firebase do seu app (esta página), ou avisando o seu backend por webhook. | Passa o token do aparelho ao SDK. |
| Abrir a conversa no toque | Repassa a notificação ao SDK. |
Quando a Atalia avisa
- Só com o cliente fora do chat. Com o chat aberto na tela, a mensagem já aparece nele.
- Uma notificação por rajada. A Atalia espera alguns segundos (5 por padrão) antes de avisar. A IA costuma mandar várias mensagens seguidas, e elas viram uma notificação só, com o total de novas.
- Uma notificação por conversa. A nova substitui a anterior da mesma conversa na bandeja.
- Quem gera notificação você escolhe no painel: atendente, agente de IA, bot de fluxo e mensagens do sistema (essas desligadas por padrão).
- Texto na tela bloqueada: a mensagem, ou só "Você tem uma nova mensagem", para atendimento com dados sensíveis.
1. Ligar no painel
No painel da Atalia, abra o canal de webchat em Editar canal, aba Instalação, seção App mobile e notificações push:
- Ligue Avisar por notificação quando chegar mensagem.
- Ligue Enviar pelo Firebase do seu app e envie a conta de serviço do Firebase (no Firebase: Configurações do projeto › Contas de serviço › Gerar nova chave privada). A Atalia confere a conta com o Google antes de gravar.
- Escolha quem gera notificação, o texto na tela bloqueada e quanto tempo esperar antes de avisar, e clique em Salvar, no topo da página.
Só administradores alteram essa seção. Ela aparece em todo canal de webchat.
2. Preparar o Firebase
- Android
- iOS
Adicione o Firebase Cloud Messaging ao app, como em qualquer push do Firebase (o google-services.json e a dependência firebase-messaging).
- No Apple Developer, crie uma chave de autenticação do APNs (arquivo
.p8). - No Firebase, em Configurações do projeto › Cloud Messaging, envie essa chave no app iOS.
- No Xcode, ative a capability Push Notifications no alvo do app.
- Adicione o Firebase Messaging ao app (o
GoogleService-Info.pliste o pacotefirebase-ios-sdk).
O iOS também sai pelo Firebase: a Atalia envia ao Firebase, que entrega pelo APNs com a sua chave.
3. Repassar o token e as notificações ao SDK
- Android
- iOS
class MeuMessagingService : FirebaseMessagingService() {
override fun onNewToken(token: String) {
Atalia.setPushToken(token)
}
// Com o app aberto, o Firebase não mostra nada sozinho: quem mostra é o SDK.
override fun onMessageReceived(message: RemoteMessage) {
val notification = message.notification
if (Atalia.handleNotification(this, message.data, notification?.title, notification?.body)) return
// ...as notificações do seu app
}
}
Ao abrir o app, envie também o token atual:
FirebaseMessaging.getInstance().token.addOnSuccessListener { Atalia.setPushToken(it) }
Com o app em segundo plano, quem mostra a notificação é o Android, e o toque abre a activity de entrada do app. Passe o intent ao SDK, que abre o chat na conversa:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Atalia.handleNotificationTap(this, intent)
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
Atalia.handleNotificationTap(this, intent)
}
- Android 13 ou mais novo: declare
POST_NOTIFICATIONSno manifest e peça a permissão ao usuário. Sem ela, nenhuma notificação aparece. - Ícone:
AtaliaOptions(notificationIcon = R.drawable.ic_notificacao)vale para o app aberto. Com o app em segundo plano, o ícone vem docom.google.firebase.messaging.default_notification_icondo manifest, como em qualquer push do Firebase. - O SDK cria o canal de notificação "Mensagens do atendimento" (
atalia_chat).
import AtaliaChat
import FirebaseCore
import FirebaseMessaging
import UserNotifications
class AppDelegate: NSObject, UIApplicationDelegate, UNUserNotificationCenterDelegate, MessagingDelegate {
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {
FirebaseApp.configure()
Atalia.configure(channelToken: "<token-do-canal>")
Messaging.messaging().delegate = self
UNUserNotificationCenter.current().delegate = self
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { _, _ in }
application.registerForRemoteNotifications()
return true
}
// nonisolated nos três: o iOS e o Firebase podem chamá-los fora da main thread.
// As funções de push da Atalia podem ser chamadas de qualquer thread.
nonisolated func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
if let fcmToken { Atalia.setPushToken(fcmToken) }
}
// App aberto: sem banner quando o chat já está na tela.
nonisolated func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
completionHandler(Atalia.presentationOptions(for: notification) ?? [.banner, .sound]) // senão, as do seu app
}
// Toque: abre o chat na conversa, inclusive quando o toque é que abriu o app.
nonisolated func userNotificationCenter(_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void) {
if !Atalia.handleNotificationTap(response.notification.request.content.userInfo) {
// ...as notificações do seu app
}
completionHandler()
}
}
Num app SwiftUI, ligue o AppDelegate com @UIApplicationDelegateAdaptor(AppDelegate.self) no App.
Não implemente as versões async destes dois métodos do UNUserNotificationCenterDelegate. Nelas, o Swift chama o completionHandler do iOS fora da main thread, e o UIKit fecha o app quando o cliente toca na notificação.
O SDK reconhece as notificações da Atalia pela chave atalia nos dados. As do seu app passam direto: handleNotification e handleNotificationTap devolvem false, e presentationOptions(for:) devolve nil, para você tratar como sempre.
Login, logout e desligar
O SDK registra o aparelho na Atalia e o acompanha sozinho:
- No
identify, o aparelho passa a receber as notificações do usuário identificado, em qualquer aparelho em que ele estiver logado. - No
logout, o aparelho volta como visitante anônimo: quem usar o app depois não recebe as mensagens do usuário anterior. - Para tirar o aparelho (o usuário desligou as notificações do atendimento no seu app), chame
Atalia.clearPushToken().
Número no ícone e notificações lidas
O número no ícone do app vem da Atalia: são as não lidas do cliente. Quando ele lê tudo, as notificações da Atalia saem da bandeja (Android) e da Central de Notificações (iOS). As do seu app ficam.
- Android
- iOS
No Android, a bolinha do ícone vem das notificações na bandeja: saindo as notificações, sai a bolinha.
O SDK mantém o número do ícone igual às não lidas. Se o seu app já tem contador próprio no ícone, desligue:
Atalia.configure(channelToken: "<token-do-canal>", options: AtaliaOptions(appBadge: false))
Com appBadge: false, nem o SDK nem o push da Atalia mexem no número, e você pode somar o Atalia.unreadCount ao seu contador.
Testar
No painel, a lista Aparelhos com o app mostra os aparelhos registrados, com o botão Enviar teste em cada um. A notificação de teste abre o chat sem conversa. Em Últimas notificações, o painel mostra o que a Atalia decidiu e entregou nos últimos dias, com o motivo quando não avisou (por exemplo, o cliente estava no chat).
Para o caminho completo, deixe o app em segundo plano e responda pela caixa de entrada da Atalia: a notificação chega depois da espera configurada.