Inicializa o DitoSDK. Deve ser chamado no AppDelegate.
// No AppDelegate, após FirebaseApp.configure()
Dito.configure()- ✅ Carrega credenciais do Info.plist
- ✅ Inicializa gerenciador de persistência offline
- ✅ Inicia monitor de conectividade
Erro comum: Chamar configure() ANTES de FirebaseApp.configure() causará erro
Identifica um usuário na plataforma Dito.
Deve ser chamado assim que você sabe quem é o usuário (após login, por exemplo).
id(String): ID único do usuário SHA1 (normalmente hash do email)data(DitoUser): Dados completos do usuário
import DitoSDK
// Crie um usuário com dados completos
let customData = [
"tipo_cliente": "premium",
"pontos": 1500
]
let user = DitoUser(
name: "João Silva",
gender: .masculino,
email: "joao@example.com",
birthday: Date(timeIntervalSince1970: 0), // Data de nascimento
location: "São Paulo",
createdAt: Date(),
customData: customData
)
// Identifique o usuário
let userId = Dito.sha1(for: "joao@example.com") // Converte email para SHA1
Dito.identify(id: userId, data: user)
print("✅ Usuário identificado")let user = DitoUser(
name: String, // Nome completo
gender: DitoGender, // .masculino, .feminino ou .outro
email: String, // Email
birthday: Date?, // Data de nascimento
location: String?, // Localização
createdAt: Date?, // Data de criação
customData: [String: Any]? // Dados customizados (JSON)
)- Sempre identifique o usuário antes de rastrear eventos
- Use SHA1 do email como ID (veja
Dito.sha1(for:)) - Os dados são sincronizados automaticamente com a plataforma
Documentação Dito: User Identification
Rastreia eventos e comportamentos do usuário.
Use para registrar qualquer ação importante no seu app.
event(DitoEvent): O evento a ser rastreado
import DitoSDK
// Evento simples
let event = DitoEvent(action: "tela_visualizada")
Dito.track(event: event)
// Evento com dados customizados
let purchaseEvent = DitoEvent(
action: "compra_realizada",
customData: [
"produto_id": "123",
"produto_nome": "Tênis Nike",
"preco": 299.90,
"categoria": "Esportes",
"quantidade": 1
]
)
Dito.track(event: purchaseEvent)
// Exemplo de eventos comuns
let viewEvent = DitoEvent(action: "produto_visualizado", customData: ["id": "456"])
let addToCartEvent = DitoEvent(action: "item_adicionado_carrinho", customData: ["valor": 50.00])
let checkoutEvent = DitoEvent(action: "checkout_iniciado", customData: ["itens": 3])
Dito.track(event: viewEvent)
Dito.track(event: addToCartEvent)
Dito.track(event: checkoutEvent)let event = DitoEvent(
action: String, // Nome da ação (obrigatório)
customData: [String: Any]? // Dados adicionais em JSON
)// E-commerce
"produto_visualizado"
"adicionar_carrinho"
"remover_carrinho"
"checkout_iniciado"
"compra_realizada"
"compra_cancelada"
// App
"tela_visualizada"
"botao_clicado"
"formulario_enviado"
"login"
"logout"
"compartilhamento"
// Notificações
"receive-ios-notification" (automático)
- Sempre identifique o usuário antes de rastrear eventos
- Os dados são sincronizados automaticamente
- Em offline, os eventos são salvos e sincronizados quando online
Documentação Dito: Event Tracking
Converte uma string (normalmente email) para SHA1.
O SHA1 é usado como ID único do usuário para identificação.
email(String): String a ser convertida (normalmente email)
- (String): Hash SHA1 da string
import DitoSDK
let email = "joao@example.com"
let sha1Hash = Dito.sha1(for: email)
print("Email: \(email)")
print("SHA1: \(sha1Hash)") // Exemplo: "a1b2c3d4e5f6..."
// Use o SHA1 para identificar
Dito.identify(id: sha1Hash, data: userData)- O SHA1 é determinístico: o mesmo email sempre gera o mesmo SHA1
- Use sempre o mesmo email para manter consistência
- O SHA1 não pode ser revertido (é hash criptográfico)
Registra o token FCM do dispositivo para receber notificações push.
Normalmente é chamado automaticamente quando o Firebase atualiza o token.
token(String): Token FCM obtido do Firebase
import FirebaseMessaging
import DitoSDK
// No MessagingDelegate
extension AppDelegate: MessagingDelegate {
func messaging(
_ messaging: Messaging,
didReceiveRegistrationToken fcmToken: String?
) {
guard let fcmToken = fcmToken else { return }
print("🔑 Novo token FCM: \(fcmToken)")
// Registra o token no Dito
Dito.registerDevice(token: fcmToken)
}
}- Chamada automaticamente via
MessagingDelegate - Você pode chamar manualmente se necessário
- O token é persistido automaticamente
Documentação Firebase: Get Registration Token
Cancela o registro do token FCM.
Use quando o usuário faz logout ou desinstal o app.
token(String): Token FCM a ser desregistrado
import DitoSDK
// Ao fazer logout
func handleLogout() {
Messaging.messaging().token { fcmToken, error in
if let fcmToken = fcmToken {
Dito.unregisterDevice(token: fcmToken)
}
}
}O DitoSDK oferece suporte completo para notificações push via Firebase Cloud Messaging (FCM).
Existem 4 cenários diferentes quando uma notificação é recebida:
Notificação Chega
↓
willPresent() chamado
↓
Banner mostrado (iOS 14+)
↓
Usuário clica
↓
didReceive() chamado
Notificação Chega
↓
(armazenada na bandeja do sistema)
↓
Usuário clica no banner
↓
didReceive() chamado
↓
didReceiveRemoteNotification() chamado
Notificação Chega
↓
(armazenada na bandeja do sistema)
↓
Usuário clica no banner
↓
App inicia
↓
didReceive() chamado
Notificação Chega (sem UI)
↓
didReceiveRemoteNotification() chamado
↓
Seu código executa em background
↓
App pode atualizar dados
Registra quando uma notificação é RECEBIDA (não clicada).
Deve ser chamado quando a notificação chega, ANTES do clique do usuário.
userInfo([AnyHashable: Any]): Dados da notificaçãotoken(String): Token FCM do dispositivo
// Quando notificação chega em foreground
func userNotificationCenter(
_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler:
@escaping (UNNotificationPresentationOptions) -> Void
) {
let userInfo = notification.request.content.userInfo
// Registra recebimento em foreground
Messaging.messaging().token { fcmToken, error in
if let fcmToken = fcmToken {
Dito.notificationRead(with: userInfo, token: fcmToken)
}
}
completionHandler([[.banner, .list, .sound, .badge]])
}
// Quando notificação chega em background (silent)
func application(
_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable: Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void
) {
if let token = self.fcmToken {
Dito.notificationRead(with: userInfo, token: token)
}
completionHandler(.newData)
}
// Quando usuário abre app do background (clica no banner)
func userNotificationCenter(
_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void
) {
let userInfo = response.notification.request.content.userInfo
Messaging.messaging().token { fcmToken, error in
if let fcmToken = fcmToken {
// Registra que foi lida
Dito.notificationRead(with: userInfo, token: fcmToken)
}
}
completionHandler()
}// O Dito automaticamente registra:
[
"titulo": "Seu Título",
"mensagem": "Sua Mensagem",
"notificacao_id": "01K9D3247BYF6ME8X1RPNT2VRN",
"usuario_id": "a24696993af35a5190a0f7f41a7e508bf87a11eb",
"referencia": "19302a24696993af35a5190a0f7f41a7e508bf87a11eb",
"link": "app://deeplink",
"canal": "DITO",
"dispositivo": "APPLE IPHONE"
]Registra quando uma notificação é CLICADA.
Chamado apenas quando o usuário toca no banner.
userInfo([AnyHashable: Any]): Dados da notificaçãocallback((String) -> Void)?: Closure com o deeplink (opcional)
- (DitoNotificationReceived): Dados da notificação processados
// Quando usuário CLICA na notificação
func userNotificationCenter(
_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void
) {
let userInfo = response.notification.request.content.userInfo
// Registra o clique
let notificationData = Dito.notificationClick(with: userInfo) { deeplink in
// Callback com o deeplink
print("🔗 Deeplink: \(deeplink)")
// Processe o deeplink para navegar
if !deeplink.isEmpty {
self.handleDeeplink(deeplink)
}
}
// Acesse os dados da notificação
print("📱 Notificação: \(notificationData.notification)")
print("👤 Usuário: \(notificationData.identifier)")
completionHandler()
}
// Função para processar deeplink
func handleDeeplink(_ deeplink: String) {
// Exemplo: app://produtos/123
if let url = URL(string: deeplink) {
// Navegue para a tela apropriada
}
}let notification: DitoNotificationReceived = [
"notification": "ID da notificação",
"identifier": "ID do usuário",
"reference": "SHA1 do usuário",
"title": "Título",
"message": "Mensagem",
"deeplink": "app://link",
"deviceType": "APPLE IPHONE",
"channel": "DITO",
"notificationName": "Nome da campanha"
]import UIKit
import Firebase
import FirebaseMessaging
import DitoSDK
import UserNotifications
@main
class AppDelegate: UIResponder, UIApplicationDelegate, MessagingDelegate {
var fcmToken: String?
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
// 1. Firebase
FirebaseApp.configure()
// 2. Messaging
Messaging.messaging().delegate = self
// 3. Dito
Dito.configure()
// 4. Notificações
UNUserNotificationCenter.current().delegate = self
registerForPushNotifications(application: application)
return true
}
private func registerForPushNotifications(application: UIApplication) {
UNUserNotificationCenter.current().requestAuthorization(
options: [.alert, .badge, .sound]
) { granted, error in
guard granted else {
print("⚠️ Notificações não autorizadas")
return
}
DispatchQueue.main.async {
application.registerForRemoteNotifications()
}
}
}
// MARK: - Remote Notifications
func application(
_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
) {
Messaging.messaging().apnsToken = deviceToken
}
func application(
_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable: Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void
) {
// Silent notification
if let token = self.fcmToken {
Dito.notificationRead(with: userInfo, token: token)
}
completionHandler(.newData)
}
}
// MARK: - Notification Delegate
extension AppDelegate: UNUserNotificationCenterDelegate {
func userNotificationCenter(
_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler:
@escaping (UNNotificationPresentationOptions) -> Void
) {
let userInfo = notification.request.content.userInfo
print("🔔 Notificação em foreground: \(userInfo)")
completionHandler([[.banner, .list, .sound, .badge]])
}
func userNotificationCenter(
_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void
) {
let userInfo = response.notification.request.content.userInfo
// Notificação foi clicada
Messaging.messaging().token { [weak self] fcmToken, error in
if let fcmToken = fcmToken {
// Registra leitura
Dito.notificationRead(with: userInfo, token: fcmToken)
// Registra clique
let notification = Dito.notificationClick(
with: userInfo
) { deeplink in
// Processe o deeplink
print("🔗 Deeplink: \(deeplink)")
}
print("✅ Notificação processada: \(notification.notification)")
}
}
completionHandler()
}
}
// MARK: - Messaging Delegate
extension AppDelegate: MessagingDelegate {
func messaging(
_ messaging: Messaging,
didReceiveRegistrationToken fcmToken: String?
) {
guard let fcmToken = fcmToken else { return }
print("🔑 FCM Token: \(fcmToken)")
self.fcmToken = fcmToken
// Registra no Dito
Dito.registerDevice(token: fcmToken)
}
}