Guia unificado para configuração e uso de Push Notifications em todas as plataformas suportadas pelo Dito SDK.
O Dito SDK suporta Push Notifications via Firebase Cloud Messaging (FCM) em todas as plataformas. Este guia fornece instruções passo a passo para configurar e usar Push Notifications em iOS, Android, Flutter e React Native.
- Acesse o Firebase Console
- Crie um novo projeto ou selecione um existente
- Ative o Cloud Messaging no projeto
Cada plataforma requer arquivos de configuração específicos:
- iOS:
GoogleService-Info.plist - Android:
google-services.json - Flutter/React Native: Ambos os arquivos acima
- Baixe o arquivo
GoogleService-Info.plistdo Firebase Console - Adicione o arquivo ao projeto Xcode
- Certifique-se de que está incluído no target do app
- No Xcode, selecione o target do app
- Vá em Signing & Capabilities
- Adicione Push Notifications
- Adicione Background Modes e marque Remote notifications
Veja o exemplo completo em iOS README.
Ordem Importante (iOS 18+):
FirebaseApp.configure()Messaging.messaging().delegate = selfDito.configure()
- Baixe o arquivo
google-services.jsondo Firebase Console - Adicione o arquivo ao diretório
app/do projeto - Adicione o plugin no
build.gradle.kts:
plugins {
id("com.google.gms.google-services")
}Veja o exemplo completo em Android README.
dependencies:
firebase_messaging: ^14.0.0
firebase_core: ^2.0.0Siga as instruções de iOS e Android.
import 'package:firebase_core/firebase_core.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}npm install @react-native-firebase/app @react-native-firebase/messagingSiga as instruções de iOS e Android.
O SDK intercepta automaticamente notificações do canal Dito quando o campo channel nos dados da notificação é igual a "DITO" (case-insensitive).
- Quando uma notificação é recebida, o SDK verifica o campo
channel - Se
channel == "DITO", o SDK processa a notificação automaticamente - Se
channel != "DITO", a notificação é ignorada pelo SDK e deve ser processada normalmente pelo app
{
"channel": "DITO",
"notification": "notification-id",
"reference": "user-reference",
"link": "https://app.example.com/product/123",
"log_id": "log-id",
"notification_name": "Nome da Notificação",
"user_id": "user-id"
}Notas sobre deeplink:
- O campo canônico no payload é
link(string). - Os wrappers Flutter e React Native aceitam
deeplinkcomo alias quando você precisa montar umuserInfomanualmente (por exemplo, vindo defirebase_messaging).
O SDK rastreia automaticamente quando uma notificação é recebida:
- iOS: Evento
receive-ios-notification - Android: Evento
receive-android-notification
Os eventos incluem:
- Canal: "mobile"
- Token do dispositivo
- ID do disparo (log_id)
- ID da notificação
- Nome da notificação
- Provedor: "firebase"
- Sistema operacional
Quando o usuário clica em uma notificação, o SDK:
- Registra o clique no CRM Dito
- Extrai o deeplink (
link) se disponível - Dispara o evento/callback exposto pela plataforma, para que o app faça navegação (ou abra navegador, etc.)
sequenceDiagram
participant User as Usuário
participant OS as Sistema Operacional
participant Native as SDK Nativo
participant Bridge as Bridge
participant App as App
User->>OS: Clica na notificação
OS->>Native: Entrega a interação
Native->>Native: Tracking do clique
Native->>Native: Extrai link
alt iOS_AndroidNativo
Native->>App: Callback com link
end
alt Flutter
Native->>Bridge: EventChannel
Bridge->>App: Stream emite evento
end
alt ReactNative
Native->>Bridge: EventEmitter
Bridge->>App: Listener recebe evento
end
stateDiagram-v2
[*] --> Recebida
Recebida --> Exibida
Exibida --> Clicada
Exibida --> Descartada
Clicada --> Processada
Processada --> EventoDisparado
EventoDisparado --> [*]
Descartada --> [*]
Versão detalhada (com responsabilidades do SDK):
stateDiagram-v2
[*] --> Enviada: Plataforma Dito envia
Enviada --> Recebida: FCM entrega ao dispositivo
Recebida --> Exibida: Sistema exibe notificação
Exibida --> Clicada: Usuário clica
Exibida --> Descartada: Usuário descarta
Clicada --> Processada: SDK processa clique
Processada --> CallbackExecutado: Callback com link
CallbackExecutado --> Navegação: App navega
Navegação --> [*]
Descartada --> [*]
note right of Recebida
SDK rastreia evento
receive-*-notification
end note
note right of Processada
SDK extrai link
e chama callback/evento
end note
flowchart TD
Start[Notificação recebida] --> CheckChannel{channel == DITO?}
CheckChannel -->|Não| Ignore[Ignorar no SDK]
CheckChannel -->|Sim| Process[Processar no SDK]
Process --> TrackReceive[Tracking de recebimento]
TrackReceive --> TrackClick[Tracking de clique]
TrackClick --> Emit[Disparar evento/callback]
Ignore --> End[Fim]
Emit --> End
graph LR
subgraph Payload[Payload FCM]
Channel[channel: DITO]
Notification[notification: ID]
Reference[reference: User Ref]
Deeplink[link: deeplink URL]
LogID[log_id: Log ID]
NotifName[notification_name: Nome]
UserID[user_id: User ID]
end
subgraph Extracted[Dados extraídos]
SDK[SDK processa]
end
subgraph Callback[Callback/evento retorna]
DeeplinkStr[deeplink: string]
NotifObj[notification: object]
end
Channel --> SDK
Notification --> SDK
Reference --> SDK
Deeplink --> SDK
LogID --> SDK
NotifName --> SDK
UserID --> SDK
SDK --> DeeplinkStr
SDK --> NotifObj
flowchart TD
Start[Callback não funciona?] --> Q1{Notificação chega?}
Q1 -->|Não| CheckFCM[Verificar configuração FCM]
Q1 -->|Sim| Q2{SDK processa?}
Q2 -->|Não| CheckChannel{channel == DITO?}
Q2 -->|Sim| Q3{Callback/evento executado?}
CheckChannel -->|Não| FixPayload[Corrigir payload da notificação]
CheckChannel -->|Sim| CheckInit[Verificar inicialização do SDK]
Q3 -->|Não| Q4{Plataforma?}
Q3 -->|Sim| Q5{Link existe?}
Q4 -->|Android| CheckListener[Verificar notificationClickListener]
Q4 -->|iOS| CheckDelegate[Verificar callback no AppDelegate]
Q4 -->|Flutter| CheckStream[Verificar Stream listener]
Q4 -->|React Native| CheckSubscribe[Verificar subscription do listener]
Q5 -->|Não| CheckPayloadDeeplink[Verificar campo link no payload]
Q5 -->|Sim| Q6{Navegação funciona?}
Q6 -->|Não| CheckNavigation[Verificar implementação de navegação]
Q6 -->|Sim| Success[Tudo funcionando]
CheckFCM --> End[Fim]
FixPayload --> End
CheckInit --> End
CheckListener --> End
CheckDelegate --> End
CheckStream --> End
CheckSubscribe --> End
CheckPayloadDeeplink --> End
CheckNavigation --> End
Success --> End
Dito.notificationClick(userInfo: userInfo) { deeplink in
if let url = URL(string: deeplink) {
UIApplication.shared.open(url)
}
}Dito.notificationClick(userInfo) { deeplink ->
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(deeplink))
startActivity(intent)
}import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:dito_sdk/dito_sdk.dart';
final ditoSdk = DitoSdk();
void setupPushClickHandling() {
DitoSdk.onNotificationClick.listen((event) {
final deeplink = event.deeplink;
if (deeplink.isEmpty) return;
// Navegação do seu app aqui
});
FirebaseMessaging.onMessageOpenedApp.listen((message) async {
await ditoSdk.handleNotificationClick(message.data);
});
}import DitoSdk, { addNotificationClickListener } from '@ditointernet/dito-sdk';
const unsubscribe = addNotificationClickListener((event) => {
if (!event.deeplink) return;
// Navegação do seu app aqui
});
// Quando o clique for detectado no JS (ex.: firebase messaging), delegue para o SDK:
await DitoSdk.handleNotificationClick(message.data);O SDK extrai automaticamente o link do payload da notificação e fornece através do callback/evento.
O deeplink deve estar no formato de URL:
https://app.example.com/product/123myapp://product/123dito://action/123
Cada plataforma tem sua própria forma de processar deeplinks:
- iOS: Usar
UIApplication.shared.open(url) - Android: Usar
IntentcomACTION_VIEW - Flutter: Usar plugins de navegação/deeplink
- React Native: Usar bibliotecas de navegação/deeplink
Checklist Geral:
- ✅ Firebase configurado corretamente
- ✅ Arquivos de configuração adicionados (
GoogleService-Info.plist/google-services.json) - ✅ Permissões solicitadas
- ✅ Token FCM registrado no SDK (
Dito.registerDevice(token)/DitoSdk.registerDeviceToken(token)) - ✅ Campo
channeligual a"DITO"no payload
Causa: Campo channel não é "DITO" ou não está presente.
Solução: Certifique-se de que o payload da notificação inclui "channel": "DITO".
Causa: Deeplink não está no formato correto ou não está sendo processado.
Solução:
- Verifique se o deeplink está no payload como
"link" - Implemente o callback corretamente
- Configure o tratamento de deeplinks no app
Causa: Ordem incorreta de inicialização no iOS 18+.
Solução: Siga a ordem exata:
FirebaseApp.configure()Messaging.messaging().delegate = selfDito.configure()- No
didRegisterForRemoteNotificationsWithDeviceToken, definaMessaging.messaging().apnsToken = deviceTokenANTES de solicitar o token FCM
{
"channel": "DITO",
"notification": "notif-123",
"reference": "user-456",
"link": "https://app.example.com/product/789",
"log_id": "log-abc",
"notification_name": "Promoção Especial",
"user_id": "user-456",
"data": {
"custom_field": "custom_value"
}
}{
"channel": "DITO",
"notification": "notif-123",
"reference": "user-456"
}