Suporte a notificações push
Acompanhe as interações do usuário com notificações push para medir campanhas de reengajamento e atribuir conversões com precisão, integrando o Firebase Cloud Messaging (FCM) com o Singular SDK.
Siga as diretrizes de implementação abaixo para garantir que os dados de notificação sejam passados corretamente para o Singular SDK para atribuição adequada.
Por que rastrear notificações push: As notificações push impulsionam o reengajamento, mas o rastreamento requer a integração correta. Singular garante que os usuários que interagem com as notificações sejam atribuídos corretamente, otimizando campanhas de marketing e estratégias de engajamento.
Guia de Implementação
Gerir notificações FCM
Substitua o método onMessageReceived() em seu FirebaseMessagingService para capturar dados de notificação quando as mensagens push chegarem.
override fun onMessageReceived(message: RemoteMessage) {
super.onMessageReceived(message)
var title = ""
var body = ""
message.notification?.let {
Log.d("singular-app", it.toString())
title = it.title ?: ""
body = it.body ?: ""
}
val data: Map<String, String> = message.data
if (data.isNotEmpty()) {
Log.d("singular-app", data.toString())
}
// Forward payload data to intent
processNotification(title, body, data)
}
@Override
public void onMessageReceived(@NonNull RemoteMessage message) {
super.onMessageReceived(message);
String title = "";
String body = "";
if (message.getNotification() != null) {
Log.d("singular-app", message.getNotification().toString());
title = message.getNotification().getTitle();
body = message.getNotification().getBody();
}
Map<String, String> data = message.getData();
if (!data.isEmpty()) {
Log.d("singular-app", data.toString());
}
// Forward payload data to intent
processNotification(title, body, data);
}
Prática recomendada: Capture o conteúdo da notificação (título, corpo) e a carga de dados para garantir que as informações de rastreamento completas estejam disponíveis para atribuição.
Processar e encaminhar dados de notificação
Crie uma intenção que inicie sua MainActivity com a carga útil da notificação anexada, garantindo que o Singular receba os dados de rastreamento.
private fun processNotification(title: String, body: String, data: Map<String, String>) {
val intent = Intent(this, MainActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
// Attach notification data to the intent
data.forEach { (key, value) ->
putExtra(key, value)
}
}
val pendingIntent = PendingIntent.getActivity(
this,
0,
intent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
val notificationBuilder = NotificationCompat.Builder(this, "your_channel_id")
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle(title)
.setContentText(body)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setAutoCancel(true)
.setContentIntent(pendingIntent)
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as? NotificationManager
notificationManager?.notify(0, notificationBuilder.build())
}
private void processNotification(String title, String body, Map<String, String> data) {
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
// Attach notification data to the intent
for (Map.Entry<String, String> entry : data.entrySet()) {
intent.putExtra(entry.getKey(), entry.getValue());
}
PendingIntent pendingIntent = PendingIntent.getActivity(
this,
0,
intent,
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE
);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, "your_channel_id")
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle(title)
.setContentText(body)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setAutoCancel(true)
.setContentIntent(pendingIntent);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (notificationManager != null) {
notificationManager.notify(0, notificationBuilder.build());
}
}
Requisito do Android 12+: Use PendingIntent.FLAG_IMMUTABLE para Android API 31+ para cumprir os requisitos de segurança.
Configurar SDK para cargas úteis de push
Adicione seletores de payload de notificação push à configuração do SDK para especificar onde os links do Singular estão localizados na estrutura de dados da notificação.
val pushSelectors = arrayOf(
arrayOf("sng_link"),
arrayOf("rootObj", "nestedObj", "anotherNested", "singularLink")
)
val config = SingularConfig("SDK_KEY", "SDK_SECRET")
.withPushNotificationPayload(intent, pushSelectors)
Singular.init(applicationContext, config)
String[][] pushSelectors = {
{"sng_link"},
{"rootObj", "nestedObj", "anotherNested", "singularLink"}
};
SingularConfig config = new SingularConfig("SDK_KEY", "SDK_SECRET")
.withPushNotificationPayload(getIntent(), pushSelectors);
Singular.init(getApplicationContext(), config);
Configuração do seletor:
-
Chaves simples: Use
arrayOf("sng_link")para chaves de nível superior na carga útil -
Chaves aninhadas: Use
arrayOf("rootObj", "nestedObj", "key")para percorrer estruturas JSON aninhadas - Múltiplos caminhos: Defina vários conjuntos de seletores para verificar diferentes locais possíveis para links Singulares
Guia de validação
Verificar carga útil na sessão inicial
Confirme que os links de notificação push são passados corretamente para o Singular inspecionando a chamada da API de início de sessão.
O Singular SDK inclui a carga útil da notificação push no parâmetro singular_link na solicitação da sessão inicial quando os usuários tocam nas notificações.
Exemplo de solicitação de início de sessão:
https://sdk-api-v1.singular.net/api/v1/start?
a=<SDK-Key>
&singular_link=https://singularassist2.sng.link/C4nw9/r1m0?_dl=singular://test&_smtype=3
&i=net.singular.singularsampleapp
&s=1740905574084
&sdk=Singular/v12.6.2
Verificação alternativa: Use o Console do SDK Singular para verificar o rastreamento de notificações por push. Verifique o campo URL do Deeplink para confirmar que o link de rastreamento foi capturado corretamente.
Configuração avançada
Configuração de domínio ESP
Configure domínios externos se você envolver links do Singular dentro do Provedor de serviços de e-mail (ESP) ou outros domínios de terceiros.
val config = SingularConfig("SDK_KEY", "SDK_SECRET")
.withESPDomains(listOf("sl.esp.link", "custom.domain.com"))
SingularConfig config = new SingularConfig("SDK_KEY", "SDK_SECRET")
.withESPDomains(Arrays.asList("sl.esp.link", "custom.domain.com"));
Nota de segurança: Por padrão, somente domínios sng.linkpredefinidos na página Gerenciar links do Singular são permitidos. Configure domínios ESP explicitamente se estiver usando links agrupados.
Roteamento dinâmico de deep link
Implemente vários destinos de deep link a partir de uma única notificação, configurando um link de rastreamento Singular com substituições de redirecionamento dinâmico.
Exemplo de caso de uso: Uma notificação de notícias de última hora com várias opções de ação
-
Ler as últimas notícias:
newsapp://article?id=12345 -
Tópicos em destaque:
newsapp://trending -
Desporto:
newsapp://sports
Em vez de criar várias ligações de seguimento, utilize uma ligação Singular e substitua os redireccionamentos dinamicamente com base na seleção do utilizador. Consulte Substituição de redirecionamentos em links de rastreamento singularespara obter detalhes de implementação.
Considerações importantes
Notas de implementação
-
Nenhum manipulador de retorno de chamada: Ao contrário de
withSingularLink, o recurso de notificação por push não fornece retornos de chamada de carga. Implemente a sua própria lógica de ligação profunda para encaminhar os utilizadores para conteúdos específicos na sua aplicação -
Fluxo de atribuição: quando os utilizadores tocam nas notificações, a Singular recupera o payload e inclui-o no evento de início de sessão desencadeado por
Singular.init(). O backend processa esses dados para atribuir o ponto de contato da notificação push e registrar o rastreamento de reengajamento -
Restrições de domínio: Por predefinição, só são permitidos os domínios de ligação Singular (
sng.link) da página Gerir ligações. Configure os domínios ESP explicitamente para links agrupados usandowithESPDomains()
Sucesso: Seguindo essas etapas, seu aplicativo agora rastreia as interações de notificação por push com o Singular, melhorando os insights de desempenho da campanha e garantindo uma atribuição precisa de reengajamento.