A Apple reconheceu um bug no iOS 17 que causava duplicatas. Isso foi corrigido no iOS 17.3. Leia mais.
Comece aqui
Escolha a seção que melhor corresponde à sua situação:- Seu servidor tenta novamente chamadas de API com falha ou seu pipeline de backend pode enviar em duplicata → Mesma mensagem enviada múltiplas vezes
- Seu app usa Firebase ou outro SDK de push junto com OneSignal → Manipuladores de notificação de terceiros
- Seu app Android personaliza notificações no código (extensão de serviço ou listener em primeiro plano) → Manipuladores de notificação Android
- Seu app iOS implementa seu próprio
UNUserNotificationCenterDelegate→ Manipulador em primeiro plano do iOS - Você só vê duplicatas em builds de desenvolvimento ou com múltiplas instalações → Múltiplas instâncias de app
Mesma mensagem enviada múltiplas vezes
A causa mais comum é enviar o mesmo payload de notificação mais de uma vez através da API do OneSignal. Razões comuns:- Seu servidor tenta novamente as requisições sem verificar se a primeira foi bem-sucedida.
- Lógica duplicada no seu pipeline de backend envia a mesma notificação duas vezes.
- Você está migrando para o OneSignal mas ainda está enviando notificações de um provedor anterior. Evite enviar de ambos os sistemas ao mesmo tempo.
Requisições de API idempotentes
Evite mensagens duplicadas reutilizando chaves de idempotência em novas tentativas.
Manipuladores de notificação de terceiros
Duplicatas podem ocorrer quando outro código no seu app processa o payload push do OneSignal e exibe sua própria notificação além da do OneSignal. Isso inclui:- Outros SDKs de push remoto (por exemplo, Firebase Cloud Messaging) que recebem o mesmo payload.
- Manipuladores de mensagens personalizados como um
FirebaseMessagingServiceno Android ou umUNUserNotificationCenterDelegateno iOS que leem o payload de entrada e constroem uma notificação local a partir dele.
Identificando notificações do OneSignal
Cada notificação do OneSignal inclui um objetocustom com uma chave i contendo o UUID da notificação do OneSignal:
JSON
Filtrando notificações do OneSignal em manipuladores de terceiros
Em qualquer manipulador não-OneSignal, verifique a chavecustom.i e retorne antecipadamente quando ela estiver presente. O OneSignal então lida com seus próprios payloads enquanto seu outro código continua processando os seus.
- Android
- iOS
Em um
FirebaseMessagingService personalizado ou outro manipulador de mensagens remotas:Kotlin
Manipuladores de notificação Android
O OneSignal expõe dois callbacks Android que permitem interceptar e personalizar uma notificação antes de ser exibida:onNotificationReceivedem uma extensão de serviço de notificação — executado para cada push, inclusive quando o app está em segundo plano.onWillDisplayem um listener de ciclo de vida em primeiro plano — executado apenas quando o app está em primeiro plano.
A regra de preventDefault() e display()
O OneSignal exibe cada notificação automaticamente a menos que você a suprima com event.preventDefault(). Dois erros comuns causam duplicatas:
- Chamar
event.getNotification().display()sem primeiro chamarevent.preventDefault()— exibe a notificação duas vezes. - Postar uma notificação separada com
NotificationManagerCompat.notify()enquanto o OneSignal também exibe a original.
display() do OneSignal ou o seu próprio NotificationManagerCompat.notify(), nunca ambos.
onWillDisplay em um listener de ciclo de vida em primeiro plano:
Kotlin
Trabalho assíncrono dentro de callbacks
Quando você faz trabalho em segundo plano (chamadas de rede, consultas ao banco de dados) antes de exibir, chamepreventDefault() de forma síncrona no callback e chame display() apenas após o trabalho assíncrono ser concluído. Retornar do callback sem preventDefault() permite que o OneSignal exiba a notificação, e uma chamada posterior a display() produz uma duplicata.
Manipulador em primeiro plano do iOS
O OneSignal se define como oUNUserNotificationCenterDelegate durante a inicialização do SDK. Se seu app também implementa o tratamento de notificações em primeiro plano, a notificação pode ser exibida duas vezes — uma vez pelo OneSignal e uma vez pelo seu código.
Padrões comuns que causam duplicatas:
- Implementar seu próprio
UNUserNotificationCenterDelegatesem encaminhar chamadas para o OneSignal, depois chamarcompletionHandler([.banner, .sound])e exibir um alerta in-app personalizado do mesmo método. - Agendar uma notificação local (
UNUserNotificationCenter.current().add(...)) em resposta a um push de entrada que o OneSignal também está exibindo.
event.preventDefault() quando quiser renderizar a notificação você mesmo:
Swift
Múltiplas instâncias de app
- Android
- iOS
- Web
Duplicatas podem ocorrer quando você tem versões de produção e desenvolvimento do seu app instaladas. Cada app tem um nome de pacote único e recebe seu próprio token push.Pressione e segure a notificação para confirmar qual instância do app a enviou.
Dicas de diagnóstico
Para depurar duplicatas mais rapidamente, colete e envie o seguinte ao suporte do OneSignal:- ID de assinatura do OneSignal do dispositivo que recebeu as duplicatas
- ID da mensagem do OneSignal ou um link para a mensagem no painel
- Lista de outras bibliotecas ou plugins no seu app
- Log de depuração reproduzindo o problema
- Etapas detalhadas de reprodução
FAQ
O que acontece se eu tiver dois SDKs de notificação no meu app?
Ambos os SDKs podem processar e exibir independentemente a mesma notificação. O OneSignal filtra suas próprias notificações automaticamente, mas outros SDKs não fazem isso. Filtre os payloads do OneSignal dos manipuladores do seu outro SDK verificando a chavecustom.i. Consulte Manipuladores de notificação de terceiros para exemplos de código.
Como enviar push de um provedor anterior e OneSignal ao mesmo tempo?
Você pode fazer a transição gradualmente, mas evite enviar a mesma mensagem de ambos os provedores.- Android: Remova o código de manipulação de notificação do SDK antigo ao integrar o OneSignal e lançar o app. À medida que os usuários atualizam, eles param de receber push do provedor antigo.
- iOS: Você pode continuar enviando do provedor antigo temporariamente enquanto os usuários atualizam. Uma vez totalmente transicionado, envie apenas do OneSignal para evitar duplicatas.
Como evitar múltiplas notificações para atualizações que mudam rapidamente?
Use umcollapse_id na API Criar notificação para substituir notificações anteriores em vez de empilhá-las. Quando múltiplas notificações compartilham o mesmo collapse_id, cada nova substitui a notificação anterior na bandeja. Isso é útil para atualizações de preços de ações, placares ao vivo, ETAs de entrega e atualizações frequentes similares.
Páginas relacionadas
Solução de problemas do SDK móvel
Resolva problemas comuns com a entrega de notificações push no iOS e Android.
Solução de problemas de web push
Depure problemas de assinatura, service worker e entrega de web push.
Solução de problemas de mensagens in-app
Corrija problemas com exibição, gatilhos e duplicatas de mensagens in-app.
Extensões de serviço móvel
Intercepte e personalize notificações push antes da exibição no iOS e Android.
Notificações não exibidas (web)
Solucione notificações web push que são enviadas mas não exibidas.