Soporte para notificaciones push
Realiza un seguimiento de las interacciones de los usuarios con las notificaciones push para medir las campañas de re-engagement y atribuir conversiones con precisión, integrando Apple Push Notification Service (APNs) con el SDK de Singular.
Sigue las pautas de implementación a continuación para garantizar que los datos de las notificaciones se transmitan correctamente al SDK de Singular y se atribuyan adecuadamente.
Por qué hacer seguimiento de las notificaciones push: Las notificaciones push impulsan el re-engagement, pero su seguimiento requiere una integración correcta. Singular garantiza que los usuarios que interactúan con las notificaciones sean atribuidos adecuadamente, optimizando las campañas de marketing y las estrategias de engagement.
Requisitos previos: Antes de que se generen los tokens de APNs y Singular pueda extraer los payloads push, verifica que se cumplan todos los siguientes puntos:
- La capacidad Push Notifications está habilitada en Xcode dentro de Signing & Capabilities para el target de la app.
- Se ha cargado una clave APNs (.p8) o certificado (.p12) en el dashboard de Singular para tu app.
- La app se compila con un perfil de aprovisionamiento que incluye el entitlement aps-environment .
- Las pruebas se realizan en un dispositivo físico — los tokens de APNs no se emiten en el simulador de iOS.
-
Singular.start(_:)se ha ejecutado antes de que el SDK pueda extraer un Singular link desde un payload de notificación a través depushNotificationLinkPath.
Guía de implementación
Registrarse para notificaciones push
Solicita autorización a los usuarios para recibir notificaciones push y registra la app con APNs utilizando UNUserNotificationCenter.
import UserNotifications
// Set the current instance as the delegate for UNUserNotificationCenter
UNUserNotificationCenter.current().delegate = self
// Define the notification authorization options (alert, badge, sound)
let pushAuthOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
// Request notification authorization from the user
UNUserNotificationCenter.current().requestAuthorization(options: pushAuthOptions) { granted, error in
// If an error occurs during authorization, print the error description
if let error = error {
print("registerForPushNotifications : failure - \(error.localizedDescription)")
}
// If the user granted permission, register for remote notifications
if granted {
// Ensure registration is done on the main thread
DispatchQueue.main.async {
UIApplication.shared.registerForRemoteNotifications()
}
}
}
- (void)registerForPushNotifications:(UIApplication *)application {
// Set delegate to self
[UNUserNotificationCenter currentNotificationCenter].delegate = self;
// Define the push notification options
UNAuthorizationOptions pushAuthOptions = UNAuthorizationOptionAlert |
UNAuthorizationOptionBadge |
UNAuthorizationOptionSound;
// Request push notification authorization
[[UNUserNotificationCenter currentNotificationCenter]
requestAuthorizationWithOptions:pushAuthOptions
completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (error) {
NSLog(@"registerForPushNotifications : failure - %@", error.localizedDescription);
}
if (granted) {
dispatch_async(dispatch_get_main_queue(), ^{
[application registerForRemoteNotifications];
});
}
}];
}
Mejor práctica: Solicita la autorización de notificaciones de forma temprana en el ciclo de vida de la app, idealmente después de demostrar valor a los usuarios, para mejorar las tasas de opt-in.
Manejar respuestas de notificaciones
Procesa las respuestas de notificaciones cuando los usuarios toquen las notificaciones push y reenvía los datos del payload a Singular para su seguimiento.
func userNotificationCenter(_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void) {
// Extract the notification payload
let userInfo = response.notification.request.content.userInfo
// Pass the notification data to Singular for tracking
Singular.handlePushNotification(userInfo)
// Call the completion handler to indicate processing is complete
completionHandler()
}
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
withCompletionHandler:(void (^)(void))completionHandler {
// Extract the push notification payload (user info)
NSDictionary *userInfo = response.notification.request.content.userInfo;
// Log the userInfo dictionary for debugging purposes
NSLog(@"didReceiveNotificationResponse userInfo = %@", userInfo);
// Pass the notification data to Singular for tracking
[Singular handlePushNotification:userInfo];
// Call the completion handler to indicate processing is complete
completionHandler();
}
Mejor práctica: Llama siempre al completion handler con prontitud para asegurar que el sistema sepa que el procesamiento de la notificación se ha completado. Una finalización retrasada puede generar advertencias del sistema o throttling.
Configurar el SDK para payloads push
Agrega selectores de payload de notificaciones push a la configuración de tu SDK para especificar dónde se ubican los Singular links dentro de la estructura de datos de la notificación.
func getConfig() -> SingularConfig? {
guard let config = SingularConfig(apiKey: "SDK_KEY", andSecret: "SDK_SECRET") else {
return nil
}
// Configure push notification link paths
config.pushNotificationLinkPath = [
["sng_link"],
["rootObj", "nestedObj", "anotherNested", "singularLink"]
]
return config
}
// Start the Singular SDK with the configuration
if let config = getConfig() {
Singular.start(config)
}
- (SingularConfig *)getConfig {
SingularConfig *config = [[SingularConfig alloc] initWithApiKey:@"SDK_KEY"
andSecret:@"SDK_SECRET"];
// Configure push notification link paths
config.pushNotificationLinkPath = @[
@[@"sng_link"],
@[@"rootObj", @"nestedObj", @"anotherNested", @"singularLink"]
];
return config;
}
// Start the Singular SDK with the configuration
SingularConfig *config = [self getConfig];
[Singular start:config];
Configuración de selectores:
-
Claves simples:
Usa
["sng_link"]para claves de nivel superior dentro del payload -
Claves anidadas:
Usa
["rootObj", "nestedObj", "key"]para recorrer estructuras JSON anidadas - Múltiples rutas: Define múltiples arreglos de selectores para comprobar diferentes ubicaciones posibles de los Singular links
Guía de validación
Verificar el payload en Start Session
Confirma que los links de notificaciones push se transmitan correctamente a Singular inspeccionando la llamada al API de start session.
El SDK de Singular incluye el payload de notificación push bajo el parámetro
singular_link
en la solicitud de start session cuando los usuarios tocan las notificaciones.
Ejemplo de solicitud de Start Session:
https://skan.singular.net:443/api/v1/start?
dnt=-1
&update_time=0
&singular_link=https://sl.sng.link/Cclbu/2a7n?_dl=com.singular.app&_smtype=3
&i=com.singular.SwiftScene
&sdk=Singular/12.7.1
&p=iOS
&v=18.2.1
Verificación alternativa: Usa la consola del SDK de Singular para verificar el seguimiento de notificaciones push. Comprueba el campo Deeplink URL para confirmar que el tracking link se capturó correctamente.
Configuración avanzada
Configuración de dominios ESP
Configura dominios externos si envuelves los Singular links dentro de un Email Service Provider (ESP) u otros dominios de terceros.
func getConfig() -> SingularConfig? {
guard let config = SingularConfig(apiKey: "SDK_KEY", andSecret: "SDK_SECRET") else {
return nil
}
// Configure ESP domains for wrapped links
config.espDomains = ["sl.esp.link", "custom.domain.com"]
return config
}
- (SingularConfig *)getConfig {
SingularConfig *config = [[SingularConfig alloc] initWithApiKey:@"SDK_KEY"
andSecret:@"SDK_SECRET"];
// Configure ESP domains for wrapped links
config.espDomains = @[@"sl.esp.link", @"custom.domain.com"];
return config;
}
Nota de seguridad:
De forma predeterminada, solo se permiten los dominios
sng.link
predefinidos en la página Manage Links de Singular. Configura los dominios ESP explícitamente si utilizas enlaces envueltos.
Enrutamiento dinámico de deep links
Implementa múltiples destinos de deep link desde una única notificación configurando un Singular tracking link con anulaciones dinámicas de redirección.
Ejemplo de caso de uso: Una notificación de noticias de última hora con múltiples opciones de acción
-
Leer las últimas noticias:
newsapp://article?id=12345 -
Tendencias:
newsapp://trending -
Deportes:
newsapp://sports
En lugar de crear múltiples tracking links, utiliza un único Singular link y anula las redirecciones dinámicamente según la selección del usuario. Consulta Anular redirecciones en Singular Tracking Links para más detalles de implementación.
Consideraciones importantes
Notas de implementación
-
Sin callback handler:
A diferencia de
singularLinksHandler, la funcionalidad de notificaciones push no proporciona callbacks de payload. Implementa tu propia lógica de deep linking para enrutar a los usuarios a contenido específico dentro de tu app -
Flujo de atribución:
Cuando los usuarios tocan las notificaciones, Singular recupera el payload y lo incluye en el evento de start session que se dispara con
Singular.start(). El backend procesa estos datos para atribuir el touchpoint de la notificación push y registrar el seguimiento de re-engagement -
Restricciones de dominio:
De forma predeterminada, solo se permiten los dominios Singular link (
sng.link) de la página Manage Links. Configura los dominios ESP explícitamente para enlaces envueltos utilizandoespDomains
Éxito: Al seguir estos pasos, tu app ahora realiza el seguimiento de las interacciones con notificaciones push mediante Singular, mejorando los insights de rendimiento de campañas y garantizando una atribución precisa de re-engagement.