OneSignal Para Notificações em Massa no Android

Receba em primeira mão o conteúdo exclusivo do Blog, além de promoções de livros e cursos de programação. Você receberá um email de confirmação. Somente depois de confirmar é que poderei lhe enviar o conteúdo exclusivo por email.

Email inválido.
Blog /Android /OneSignal Para Notificações em Massa no Android

OneSignal Para Notificações em Massa no Android

Vinícius Thiengo27/09/2016
(3041) (49) (94) (12)
Go-ahead
"O início de um hábito é como um fio invisível, mas a cada vez que o repetimos o ato reforça o fio, acrescenta-lhe outro filamento, até que se torna um enorme cabo, e nos prende de forma irremediável, no pensamento e ação."
Orison Swett Marden
Código limpo
Capa do livro Refatorando Para Programas Limpos
TítuloRefatorando Para Programas Limpos
CategoriaEngenharia de Software
AutorVinícius Thiengo
Edição
Ano2017
Capítulos46
Páginas598
Comprar Livro
Conteúdo Exclusivo
Receba em primeira mão o conteúdo exclusivo do Blog, além de promoções de livros e cursos de programação.
Email inválido

Opa, blz?

Nesse artigo vamos trabalhar com a ferramenta Web de notificações, OneSignal. Aqui vamos utilizá-la somente no contexto do Android, mas é possível trabalha-la também com várias outras plataformas ou frameworks como, respectivamente, IOS e Unity.

Nesse artigo vamos abordar:

O que é? Como funciona?

Como explicado no início do artigo, o OneSignal é uma ferramenta para envio de push messages, notificações. Não somente para devices Android, mas também para várias outras plataformas.

Ele é gratuito e tem características para somente trabalho com envio de notificações em massa, mais precisamente: não é trivial enviar mensagens para cada usuários de forma única, mas é possível por meio de segmentação.

Empresas como UBER, Zynga e Cisco utilizam o OneSignal (indícios de que é uma boa ferramenta).

Uma curiosidade sobre as notificações, não somente as do OneSignal, mas em geral, é que é possível reter boa parte dos usuários de sua APP mobile ou Web apenas utilizando-as, como acontece com o email marketing na maior parte dos sites.

Segundo a OneSignal, a empresa de streaming de vídeo, YouNow, conseguiu reter 19% a mais dos usuários de sua plataforma Web utilizando somente push messages.

Importante lembrar que o OneSignal ainda não utiliza o FCM (Firebase Cloud Messaging) e sim o GCM (Google Cloud Messaging).

Mas o GCM será descontinuado?

Teoricamente essa descontinuação já deveria ter ocorrido, digo, o GCM não mais estar funcionando. Porém, provavelmente, a migração para FCM não está indo tão rápido, logo, podemos assumir que o uso do GCM ainda continuará sendo válido.

Bom, com isso podemos prosseguir com os códigos.

Construindo o projeto e utilizando o dashboard Web do OneSignal

O primeiro passo é criar um projeto vazio (Empty Project) no AndroidStudio. Lembrando que aqui vou seguir com o AndroidStudio, mas o OneSignal tem também documentação para o Eclipse.

Defina o nome que quiser para sua APP. Aqui vou seguir com "One Signal Notification".

Logo depois entre no site da OneSignal e realize o cadastro depois de clicar em "LOG IN" e então em "Sign up". Terá de confirmar seu endereço de email. Outra opção é seguir o acesso com alguma de suas contas sociais caso prefira.

Agora entre no Google Services Wizard para gerar sua Server API Key e Sender ID.

No campo "App Name" coloque o nome de sua APP. No campo "Android package name" coloque o nome do package de seu projeto. Esse último você consegue acessando seu AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="br.com.thiengo.onesignalnotification">

...
</manifest>

 

Logo depois selecione o país, Brasil. E então clique em "Choose and configure services". Na próxima tela clique em "ENABLE GOOGLE CLOUD MESSAGING".

Copie o Server API Key e coloque como comentário na MainActivity de seu projeto. Faça o mesmo com o Sender ID. Segue como ficará na MainActivity:

public class MainActivity extends AppCompatActivity {
// Server API Key
// Sender ID

...
}

 

Agora entre no OneSignal dashboard, digo, realize o login. Caso apareça alguma tela de "tutorial de dashboard", passe os slides ou feche todo o tutorial. Com todas as telas iniciais fechadas, clique em "Add a new app".

Coloque o nome dela e logo em seguida clique em "Create".

Você será enviado a outra parte do dashboard, dessa vez a área referente a APP que acabou de criar. No menu esquerdo clique em "App settings".

Logo depois, na linha que tem "Google Android" clique em "Configure". Então vá em sua MainActivity, copie a Server API Key e cole no campo "Google Server API Key" apresentado logo depois do clique em "Configure".

Agora, para finalizar essa configuração de dashboard, clique em "Save". Assim a visualização do App Settings deve estar similar a imagem abaixo:

Agora clique na aba "Keys & IDs" e copie o OneSignal APP ID. Seguindo o caminho que fizemos com o Server API Key e com o Sender ID, cole essa OneSignal APP ID no MainActivity, como comentário:

public class MainActivity extends AppCompatActivity {
// Server API Key
// Sender ID
// OneSignal API Key

...
}

 

Então abra o Gradle APP level, build.gradle (Module: app), e coloque as seguintes dependências:

apply plugin: 'com.android.application'

android {
compileSdkVersion 24
buildToolsVersion "24.0.2"
defaultConfig {
applicationId "br.com.thiengo.onesignalnotification"
minSdkVersion 10
targetSdkVersion 24
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:24.2.1'
testCompile 'junit:junit:4.12'

compile 'com.onesignal:OneSignal:3.+@aar'
// Required for OneSignal, even if you have added FCM.
compile 'com.google.android.gms:play-services-gcm:+'
// Required for geotagging
compile "com.google.android.gms:play-services-location:+"
}

 

Não sincronize ainda! Logo depois de applicationId em defaultConfig coloque o seguinte:

manifestPlaceholders = [manifestApplicationId: "${applicationId}",
onesignal_app_id: "OneSignal API Key",
onesignal_google_project_number: "Sender ID"]

 

Para completar esse trecho no Gradle, somente substitua o OneSignal API Key e Sender ID pelos valores respectivos salvos em comentários em sua MainActivity. Logo depois sincronize o projeto.

Agora crie uma nova classe, CustomApplication. E defina a incialização do OneSignal nela:

public class CustomApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
OneSignal.startInit(this).init();
}
}

 

Ainda temos de definir essa Application como a classe de aplicação de nosso projeto, logo, abra o AndroidManifest.xml e acrescente o seguinte na tag <application>:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="br.com.thiengo.onesignalnotification">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:name=".CustomApplication">
...
</application>
</manifest>

 

Caso não conheça a classe Application, veja esse artigo: Application Class no Android, Entendendo e Utilizando

Execute um emulador que tenha o Google APIs nele ou então utilize um device real. Depois dessa execução e clicando em "OneSignal Notification" no OneSignal Dashboard temos:

Agora clique em "New Message" no menu esquerdo. Em seguida coloque o título da notificação e o conteúdo dela:

Abaixo tem a opção de adicionar outras linguagens, ou seja, criar mais de uma push notification para que usuários de diferentes idiomas recebam o conteúdo correto a eles.

O padrão é o inglês, não é possível desmarca-lo, pois para qualquer linguagem que você não forneça uma push notification específica, o inglês será utilizado:

Vamos seguir somente com o inglês nesse exemplo, mas sinta-se a vontade para fornecer também a versão em português.

Logo abaixo da configuração de idioma tem três abas. Continue em "Send To Everyone". Logo depois clique em "Options" para expandi-lo. Agora podemos visualizar um dos maiores "poderes" do OneSignal, a total personalização da push message:

Os campos "Sound", "Small Icon", "Large Icon" e "Big Picture" aceitam um resource name (o nome do arquivo que será utilizado e que está em sua APP, em algum folder dentro da pasta res).

Antes de prosseguir com a explicação desses campos, devemos configurar algo a mais em nossa APP de exemplo. Temos de definir um ícone de notificação para ela. Caso não seja definido um, o ícone da APP é que será utilizado na notificação.

Se você não souber como criar um, pode utilizar algum dos ícones disponíveis em Material Design Icons. Logo depois, para criar todos os formatos necessários, vá em Android Asset Studio e crie todos os tamanhos necessários para o ícone de notificação que você escolheu para a APP.

Depois de gerar todas as versões necessárias de ícones no Android Asset Studio, abra o .zip descarregado, copie todos os folders dentro de res e em seu projeto no AndroidStudio cole em app/res/drawable.

Para finalizar altere o nome de alguma das versões do ícone, altere para ic_stat_onesignal_default como pede a documentação do OneSignal.

Por que somente de alguma das versões?

Porque o AndroidStudio vai se encarregar de refatorar todos as outras versões do mesmo ícone, digo, atualizar o nome delas.

Pronto, agora o ícone adicionado será o ícone padrão utilizado pelo OneSignal. Não se esqueça de dar o "Rebuild Project" no projeto e executá-lo novamente no device de testes.

Ícone padrão? É possível utilizar outro?

Sim, é possível. Lembra que os campos "Small Icon" e "Large Icon" aceitam um resource name? Então, esse resource name pode ser de qualquer outro ícone presente em sua APP.

Observação: os campos "Large Icon" e "Big Picture" também aceitam URLs. No vídeo desse artigo faço um teste com a capa de meu livro Refatorando Para Programas Limpos.

O campo "LED Color" permite que você defina qual cor será utilizada no LED de notificação do device, isso se ele tiver um. O formato de cor que deve ser fornecido é ARGB.

O campo "Accent Color" permite o mesmo formato de cor de "LED Color", porém o resultado é aplicado no background de "Large Icon".

As opções de "Lockscreen Visibility" trabalham da seguinte forma:

  • Public: a notificação aparecerá também na lockscreen do device;
  • Private: a notificação somente aparecerá na lockscreen do device caso o ele esteja com a opção para mostrar todas as notificações, ativada;
  • Secret: a notificação não é apresentada na lockscreen.

Para "Lockscreen Visibility" vamos seguir com a seleção em "Public".

O campo "Group Key" permite que as mensagens de diferentes envios de OneSignal para sua APP sejam todas agrupadas caso tenham o mesmo "Group Key".

"Group Message" nos permite definir a mensagem que aparece acima do agrupamento de mensagens na área de notificações do device.

Não se preocupe com os dois últimos campos apresentados até aqui. É um pouco confuso mesmo, mas vamos aborda-los em um exemplo mais adiante.

O checkbox "Background data" não teve efeito nenhum em meus testes, logo, vamos ignorá-lo aqui.

Logo depois, em "Include Additional Data?" adicione o seguinte par key-value:

  • Key: book. Value: Refatorando Para Programas Limpos

O campo "Launch URL?" permite que seja definida a URL da página que será aberta no navegador principal do device (e não o WebView de nossa APP) assim que o usuário do aparelho acionar a notificação. Em nosso caso vamos manter em branco.

O Campo "Include Android / iOS Action Buttons?" permite que seja difinido os Buttons da notificação, nesse exemplo vamos utilizar dois:

  • Key: button_1. Value: Abrir APP 1;
  • Key: button_2. Value: Abrir APP 2.

Pode deixar vazios os campos referentes aos ícones.

Ignore o campo "Include Chrome Web Push Action Buttons?", ele não é útil aqui.

Nessa terceira parte de configuração de mensagens temos:

Clique em  "Schedule / Send Later" para expandi-lo. Nas opções em "Optimize per-user delivery time?" podemos deixar o OneSignal entregar as notificações das seguintes maneiras:

  • Assim que o horário de envio de mensagens chegar. Muitas vezs é imediatamente depois de criar a push message;
  • No mesmo horário da última vez que o usuário utilizou a APP;
  • Em um horário que definimos, porém será no mesmo horário local do usuário da APP, respeitando as diferenças de fuso.

Deixe a primeira opção marcada.

As opções de "Schedule notifications for a later time?" nos permitem:

  • Começar a entregar as mensagens imediatamente depois de criar a push message;
  • Definir um dia e / ou horário para entregar as mensagens. Agendamento das notificações. As mensagens agendadas ficam disponíveis em "Scheduled", uma opção do menu esquerdo do dashboard.

Deixe a primeira opção marcada. Com isso temos nessa última parte de configuração como abaixo:

Note o campo "Will Deliver" apresentando um resumo de como e quando será o envio, se baseando nas escolhas em "Schedule / Send Later".

Agora clique em "Preview". Será carregada uma tela com as configurações que você definiu para a push message. Confirme essas e clique em "Send".

Aparecerá na área de notificações de seu device de teste um conteúdo similar ao da imagem abaixo:

Clicando na notificação a APP será aberta.

Veja que no dashboard OneSignal somos encaminhados para um analytics em tempo real (de 20 em 20 segundos há a atualização). 

Logo abaixo de "Notification Clicks" tem alguns Buttons para filtro no gráfico. No final da página há todo o conteúdo de mensagem que foi enviado.

Agora, no menu esquerdo, clique em "Sent" para visualizar as mensagens que já foram enviadas:

Ainda no menu esquerdo clique em "Segments". Nessa área podemos ver os segmentos de usuários já presentes para nossa APP e também criar alguns novos.

No OneSignal é por meio de segmentos de usuários que enviamos as push messages. Vamos criar um.

Clique em "New Segment" no final da página de segmentos. Logo depois dê o nome "Brasil" para o segmento. Depois de criado o segmento e carregado a página de segmentos, navegue até o segmento "Brasil" e clique em "Add Filter".

No menu suspenso que aparecer selecione "Country" e logo depois, no outro menu suspenso, selecione "Brazil". Então apenas clique em "Save".

Se você estiver em outro país, selecione o país que se encontra, pois nós vamos utilizar esse segmento de usuário em nossa próxima push message.

Assim criamos um segmento: 

No menu esquerdo clique em "New Message". Logo depois coloque um título e conteúdo aleatórios, apenas para testes. Logo abaixo clique na aba "Send by Segment". Então em "Send to segments" selecione "Brasil".

Expanda "Options" e coloque em "Group Key" o conteúdo "teste". Em "Group Message" coloque "$[notif_count] mensagens".

Feche a APP no device de testes e então envie a push message. Clique em "Preview" e logo depois em "Send".

Antes de conferir os resultados, envie uma outra push message exatamente como enviamos a anterior, incluindo os mesmos "Group Key" e "Group Message".

Logo depois deverá ter uma notificação similar ao da imagem abaixo, em seu device de testes:

Como as chaves em "Group Key" são as mesmas para as mensagens enviadas, elas são agrupadas em apenas uma notificação. O título do agrupamento é definido pelo campo "Group Message" onde o trecho $[notif_count] nos permite acessar o número de mensagens já acumuladas.

Importante: caso você não utilize o mesmo "Group Key" para as mensagens, mais de uma notificação vai aparecer na barra de status do device.

Agora clique em "Templates" no menu esquerdo. Logo depois clique em "New Template". Defina uma push message como já definimos até aqui. No início do formulário de push message forneça um nome de template e clique em "Save".

Logo depois repita o processo, clicando em "Templates" no menu esquerdo e seguindo os passos já descritos anteriormente, dessa vez para criar uma segunda push message. Ao final você terá algo como:

Essas mensagens prontas podem ser utilizadas em "Automated" (mensagens automatizadas) ou em "A/B Test Messages".

Agora clique em "Automated", logo depois clique em "New Automatic Message". Coloque o nome da mensagem automatizada que você está criando. Aqui vou utilizar "Wellcome".

Então defina o template de mensagem que será utilizado e então os segmentos de usuários que vão ou não participar, isso nos respectivos campos "Deliver to users in segments" e "Exclude users in segments".

Para finalizar há três opções de check:

  • Envie a mensagem automatizada no mesmo horário que o usuário utilizou a APP pela última vez;
  • Entregue a mensagem uma única vez, ao menos que ele volte a APP;
  • Entregue a mensagem uma única vez, ao menos que as horas definidas aqui tenham já decorrido.

Em nosso exemplo não precisamos de nenhuma dessas opções marcadas: 

Clique em "Save". Terá algo similar a: 

O script de mensagens automatizadas do OneSignal roda uma verificação de 30 em 30 minutos. Assim que algum usuário de sua APP fique dentro dos critérios definidos para as mensagens automatizadas que você criou, ele recebe essa mensagem.

Em nosso caso, o device de testes receberá uma notificação já que nossa classificação inclui todos os usuários da APP: 

Depois desse envio o device não mais recebe essa mensagem automatizada, devido a nossa configuração de mensagem automatizada.

Agora clique em "A/B Test Messages". Logo depois clique em "New A/B Test". Defina um nome para seu teste A/B e então escolha "criar uma nova mensagem" ou escolha entre algum dos templates que você já construiu.

Aqui, para "Test A" e "Test B" vou escolher respectivamente as mensagens "Template A" e "Template B" que eu já tinha definido como templates.

Abaixo há as opções de segmentos de usuários e de agendamento, como na criação de uma nova push message. Apenas coloque segmento com o "All" definido e clique em "Preview".

Você vai notar que o OneSignal utiliza 25% dos usuários das plataformas (Android, IOS, Chrome, ...) envolvidas no envio. Esses 25% são escolhidos de forma aleatória.

Clique em "Send". Você terá uma tela similar a:

As mensagens em nosso teste não serão enviadas, pois temos de ter ao menos uma plataforma com pelo menos oito subscribers ativos de acordo com os segmentos escolhidos. Em nosso caso somente temos o nosso device de teste, mas obviamente que você pode cadastrar ainda mais usuários (caso já esteja em produção) e então realizar o test A/B de forma eficiente.

Note que abaixo de cada gráfico que é atualizado em tempo real, há um Button permitindo que, de acordo com os números, você envie a mensagem escolhida para o restante dos usuários, ou seja, os outros 75%.

Se clicar em "Sent" no menu esquerdo, verá que as mensagens do teste A/B que criamos a pouco estão "Enfileiradas", devido ao número pequeno de subscribers elas permanecem nesse estado e não são enviadas.

É importante ressaltar que testes A/B tendem a trazer melhores resultados para suas campanhas depois de alguns testes e então a descoberta das mensagens que mais trazem engajamento em sua APP.

Agora vamos criar classes em nosso projeto para obter o conteúdo das push messages OneSignal enviadas. Começamos pela classe CustomNotificationOpenedHandler:

public class CustomNotificationOpenedHandler implements OneSignal.NotificationOpenedHandler {
@Override
public void notificationOpened(OSNotificationOpenResult result) {
JSONObject data = result.notification.payload.additionalData;

if( data != null ){
Log.i("Log", "notificationOpened: "+data);
}
}
}

 

Note que temos de implementar a Interface OneSignal, NotificationOpenedHandler. Em nosso exemplo somente queremos saber o que veio como dados adicionais, mas podemos acessar qualquer um dos valores definidos em uma push message no dashboard OneSignal.

Essa classe ainda não está vinculada ao OneSignal em nossa APP, na verdade, uma instância dela. Vamos voltar ao nosso CustomApplication a adicionar o seguinte código:

public class CustomApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
OneSignal
.startInit(this)
.setNotificationOpenedHandler( new CustomNotificationOpenedHandler() )
.init();
}
}

 

Agora, toda vez que o usuário acionar a notificação será printado nos logs do AndroidStudio os dados que foram enviados adicionalmente junto a push message.

Podemos assim partir para a classe CustomNotificationReceivedHandler que implementa a Interface NotificationReceivedHandler:

public class CustomNotificationReceivedHandler implements OneSignal.NotificationReceivedHandler {
@Override
public void notificationReceived(OSNotification notification) {
JSONObject data = notification.payload.additionalData;

if( data != null ){
Log.i("Log", "notificationReceived: "+data);
}
}
}

 

Como em CustomNotificationOpenedHandler devemos configurar uma instância de CustomNotificationReceivedHandler na inicialização de OneSignal:

public class CustomApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
OneSignal
.startInit(this)
.setNotificationOpenedHandler( new CustomNotificationOpenedHandler() )
.setNotificationReceivedHandler( new CustomNotificationReceivedHandler() )
.init();
}
}

 

Execute a APP em seu device de testes, feche ela e então envie uma nova mensagem do OneSignal dashboard. Não se esqueça de definir algo em "Include Additional Data?", caso contrário nada será apresentado no AndroidStudio, digo, nos logs dele.

Com isso você terá algo similar, nos logs do Android:

09-27 08:50:34.472 2957-2994/br.com.thiengo.onesignalnotification I/Log: notificationReceived: {"book":"Refatorando Para Programas Limpos"}

 

Clicando na notificação, nos logs aparecerá também:

09-27 08:52:15.984 2957-2957/br.com.thiengo.onesignalnotification I/Log: notificationOpened: {"book":"Refatorando Para Programas Limpos"}

 

Caso você queira definir uma lógica diferente para a apresentação da notificação ou até mesmo sobrescrever algumas das características dela, você pode implementar um NotificationExtenderService. Segue nova classe CustomNotificationExtenderService:

public class CustomNotificationExtenderService extends NotificationExtenderService {
@Override
protected boolean onNotificationProcessing(OSNotificationReceivedResult notification) {
JSONObject data = notification.payload.additionalData;

if( data != null ){
Log.i("Log", "onNotificationProcessing: "+data);
}
return true;
}
}

 

Como estamos em teste, vamos utilizar um código muito similar ao código de CustomNotificationReceivedHandler.

Note que a grande diferença na utilização de uma instância de NotificationExtenderService em relação as outras entidades de obtenção de conteúdo de notificação OneSignal está no retorno do método onNotificationProcessing().

Caso false seja o retorno, estaremos dizendo ao sistema que o comportamento comum com notificações que chegam a essa APP deve ser permanecido, ou seja, apresentar a notificação na barra de status quando a APP estiver fechada ou apresentar um dialog quando a APP estiver aberta.

Caso true seja retornado, estaremos informando que nós é que vamos tratar a notificação, nesse caso nem mesmo uma instância de NotificationReceivedHandler é acionada.

Em nosso teste já setamos o retorno para true, sendo assim somente o método onNotificationProcessing() será acionado.

Antes de partirmos para o OneSignal dashboard, devemos setar esse novo Service no AndroidManifest.xml, segue:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="br.com.thiengo.onesignalnotification">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:name=".CustomApplication">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<service
android:name=".CustomNotificationExtenderService"
android:exported="false">
<intent-filter>
<action android:name="com.onesignal.NotificationExtender" />
</intent-filter>
</service>
</application>
</manifest>

 

Agora crie uma nova mensagem no OneSignal dashboard, coloque algo em "Include Additional Data?" e então envie. Não esqueça de executar antes, a nova versão da APP em seu device de testes.

Logo depois de enviar a mensagem, nada será apresentado na área de notificações da APP, mas você pode perceber que nos logs do AndroidStudio a mensagem chegou:

09-27 08:50:34.397 2957-2994/br.com.thiengo.onesignalnotification I/Log: onNotificationProcessing: {"book":"Refatorando Para Programas Limpos"}

 

Com isso, finalizamos a apresentação do OneSignal.

Outras ferramentas para notificação

Aqui no blog já apresentamos outras formas de trabalhar com notificações. Abaixo algumas dessas em artigos:

Há sistemas de notificação online que não utilizam os servidores nativos de notificação, digo, os servidores das plataformas mobile. Esses trabalham com conexão XMPP com os devices.

Vídeo com implementação passo a passo

Abaixo o vídeo com a implementação completa também do exemplo desse artigo. Nele há alguns testes a mais:

Para acessar o projeto completo, entre no GitHub em: https://github.com/viniciusthiengo/one-signal-notification

Conclusão

Anteriormente já tinhamos apresentado aqui no blog o método de notificação, push message, do Firebase via dashboard. Até aquele momento eu o tinha abordado como uma das maneiras mais fáceis de utilizar notificação no Android.

Porém, mesmo ainda utilizando o GCM notei que o OneSignal é mais completo quanto as opções e tão simples quanto o Firebase Dashboard Notification.

O GCM ainda continuará sendo utilizado, a princípio, pois mesmo o Google colocando datas de depreciação ou não mais funcionamento, aparentemente a migração de código não está sendo rápida quanto esperado.

O receio que pode haver com a ainda utilização do GCM acredito que é um pouco irrelevante, tendo em mente que a OneSignal tem mais de 70K developers usuários e grandes empresas o utilizam, fazendo com que caso o FCM seja aplicado, a documentação de migração estará pronta a nós developers.

E, não menos importante, ele é gratuito.

Fontes

Documentação OneSignal

Material Design Icons

Android Asset Studio For Icons

Vlw.

Receba em primeira mão o conteúdo exclusivo do Blog, além de promoções de livros e cursos de programação.
Email inválido

Relacionado

ConstraintLayout, Melhor Performance no AndroidConstraintLayout, Melhor Performance no AndroidAndroid
Checkout Transparente da Web no AndroidCheckout Transparente da Web no AndroidAndroid
Appnext para Monetizar sua APP AndroidAppnext para Monetizar sua APP AndroidAndroid
Scrum - A Arte de Fazer o Trabalho na Metade do TempoScrum - A Arte de Fazer o Trabalho na Metade do TempoLivros

Compartilhar

Comentários Facebook (21)

Comentários Blog (28)

Para código / script, coloque entre [code] e [/code] para receber marcação especifica.
Forneça seu nome válido.
Forneça seu email válido.
Forneça o comentário.
Enviando, aguarde...
Maurinaldo (1) (0)
21/02/2017
Parabéns pelo post e pelo blog Vinícius.

Estou com uma dúvida aqui. Existe alguma forma de impedir que o aplicativo receba uma notificação enquanto estiver aberto? Isso para que não apareça uma caixa de diálogo enquanto o usuário estiver navegando no aplicativo.

Abraço!
Responder
Vinícius Thiengo (0) (0)
24/02/2017
Maurinaldo, tudo bem?

Utilizando o NotificationExtenderService você consegue isso.

Por exemplo, quando o aplicativo está aberto, você pode colocar uma variável pública na atividade principal, pública e estática, do tipo boolean onde ela já inicia na declaração com o valor false, em onCreate() ela fica com valor true e no onDestroy() com o valor false novamente.

Em sua implementação de NotificationExtenderService verifique se essa variável da atividade principal está true, se sim, retorne true, nada será apresentado na tela do usuário, caso contrário retorne false, assim a notificação aparecerá na barra de status do device.

No vídeo e artigo falo um pouco mais sobre a NotificationExtenderService. Abraço.
Responder
19/02/2017
Thiengo, esta SDK envia notificações quando o app não está aberto? Pois não estou conseguindo.
Responder
Vinícius Thiengo (0) (0)
19/02/2017
Alisson, tudo bem?

Envia sim, se não me engano, no vídeo fiz esse teste também. Porém você já não é o primeiro que tem essa dúvida. Deve ter sido algum problema na configuração da API do OneSignal

Se estiver utilizando o NotificationExtenderService, faça o um teste com ele retornando false para ver se funciona sem problemas as notificações mesmo com o aplicativo fechado. Abraço.
Responder
Rony Freitas (1) (0)
14/01/2017
Parabéns pelos videos, Vinícios! Os melhores.
Bem, eu tenho um APP com o OneSignal implementado e utilizo o Group Key e o Group Message para simplificar as notificações. Mas estou com um probleminha. Quando o usuário clica na notificação, ele é mandando para uma Activity especifica, porem quando tem mais de uma notificação ele é mandado da mesma forma para só uma das notificações (acredito que a ultima). Como eu contorno isso? Qual seria a melhor maneira ou a maneira automática de descobrir se tem mais uma notificação ao invés de mandar mais dados?
Responder
Vinícius Thiengo (0) (0)
20/01/2017
Rony, tudo bem?

Cada notificação enviada deve ter os dados relativos a ela. Caso seja notificação nova de uma já envida, então os dados dela vão sobrepor os da antiga já no device.

Porém para notificações diferentes, Group Key diferentes, terá mais de uma notificação no device do usuário, cada uma com seus próprios dados.

Nesse caso, utilizando o OneSignal.NotificationOpenedHandler você consegue acessar o result.notification.payload.additionalData para obter os dados que indicam (dados informados por ti na criação da notificação) qual Activity abrir.

Dessa forma você terá os dados únicos de cada notificação presente para o usuário, independente de qual chegou primeiro. Obviamente que as que substituíram outras de mesmo Group Key terão os dados mais atuais.

Caso queira também manter os dados das primeiras notificações de mesmo Group Key, uma maneira é replicar os dados na nova notificação, incluindo a isso os novos dados. Abraço.
Responder
Oliver (1) (0)
15/12/2016
Parabéns ótimos tutoriais, tenho aprendido bastante.

O  NotificationCompat.BigPictureStyle  só funciona com o app aberto?
Como faz para ele apresentar uma imagem mesmo com o app fechado?

Abraco,
Responder
Vinícius Thiengo (0) (0)
15/12/2016
Oliver, tudo bem?

Já me relataram problema similar, na verdade o problema foi que quando a APP não estava nem mesmo no background a push message não chegava.

Mas em seu caso, aparentemente, a push message chega, porém a big-picture não funciona.

Preciso que você realize o mesmo teste com a big-picture e então copie e cole aqui o que está sendo printado nos logs do Android Studio, assim da para ver o que pode estar ocorrendo. Abraço.
Responder
22/11/2016
Olá Thiengo, primeiramente parabéns pelo post, me ajudou muito!
Tenho a seguinte dúvida. Minha aplicação tem um menu lateral, queria que quando uma notificação chegasse eu abrisse uma determinada fragment daquele menu. Como eu faço isso?
Responder
Vinícius Thiengo (0) (0)
23/11/2016
Tiago, tudo bem?

No notificationReceived(), quando a APP estiver aberta, você consegue junto ao EventBus, por exemplo, enviar o dado para a Activity que tem o menu lateral e então, via Java API (o código Java de sua Activity) alterar o item do menu que deverá estar marcado como ativo e logo após abrir o fragmento desejado.

Note que não dei a opção de dar o trigger na opção do menu e aguardar tudo ocorrer (a marcação do item e a abertura da Fragment), isso, pois tive alguns problemas quando tentei essa opção em APPs passadas.

Caso não conheça o EventBus, veja esse artigo / vídeo que tenho sobre ele:

http://www.thiengo.com.br/eventbus-lib-comunicacao-entre-entidades-android

Não deixe de acessar a página oficial dessa library, indicada no artigo, e de também ler os comentários, pois esses tendem a responder algumas dividas que surgirem.

Abraço.
Responder
Marco Aurélio (1) (0)
18/11/2016
Boa noite Thiengo, eu havia colocado o One Signal no meu projeto do mesmo jeito que você ensinou e estava funcionando perfeitamente... Só que hoje fui abrir o projeto e começou a dar uns erros no "import com.onesignal.OneSignal;" sabe o que pode ser isso?
Responder
Vinícius Thiengo (0) (0)
19/11/2016
Marco Aurélio, tudo bem?

Provavelmente deve ter sido alguma atualização na library deles, pois deve estar utilizando a referência gradle:

compile ?com.onesignal:OneSignal:3.+@aar'

Com o ?+" sendo utilizado e não uma versão específica. A última versão ativa, pelo que vi no GitHub da Android API deles, é a 3.4.1, logo, tente utilizando a seguinte referência ante a apresentada anteriormente:

compile ?com.onesignal:OneSignal:3.4.1@aar?

Se mesma assim nada, volte aqui e coloque nos comentários a mensagem de erro que está sendo apresentada. Abraço.
Responder
Jose Carlos Junior (1) (0)
08/11/2016
Na coluna "Subscribed" aparece assim "No (Outdated Google Play Services App)" e no video notei que aparece Yes, e na hora que vou adicionar uma mensagem aparece um erro "The selected segments do not have any users", o que preciso fazer?
Responder
Vinícius Thiengo (0) (0)
10/11/2016
Jose, tudo bem?

Está utilizando um device que tenha o Google Play Services instalado ou atualizado?

Realize os testes em um device real, não no emulador, para ver se passa sem problemas. Se persistir o bug, volte aqui. Abraço
Responder
Jose Carlos Junior (1) (0)
17/11/2016
Deu certo, Vinicius é possível deixar as notificações em uma activity especifica para que o usuário visualize ela dentro do app e depois possa estar apagando? Se sim, você tem algum material que eu possa estar olhando para tentar fazer? Obrigado.
Responder
Vinícius Thiengo (0) (0)
19/11/2016
Jose Carlos, tudo bem?

É possível sim. Como podemos obter em nosso código todo o conteúdo da notificação que vem do OneSignal, você pode diretamente nos métodos de acesso a notificação colocar invocações a métodos para salvar essas notificações em sua base local.

Como base local você tem as seguintes opções:

Realm: https://www.youtube.com/playlist?list=PLBA57K2L2RIJz9eAlODBynIfWQgckZaXc

SQLite: http://www.thiengo.com.br/sqlite-no-android-entendendo-e-utilizando

Firebase Offline Mode: https://firebase.google.com/docs/database/android/offline-capabilities?hl=pt-br

Não há uma opção melhor. Mas a versão com SQLite tende a representar de forma mais próxima sua base de dados relacional remota, pois ela é relacional também. O Real é simples e rápido. O Firebase é muito rápido e simples também.

Depois de salvar os dados de notificação. Crie uma Activity para em uma ListView ou RecyclerView, apresentar os dados da base local, digo, os dados de notificação.

Nos itens da lista escolhida, você poderá colocar opções de remoção, envio e outras. Mas todas as opções serão feitas via lógica de negócio, não há nada pronto em relação isso.

Abaixo deixo alguns links de artigos aqui do blog sobre as duas views acima, ListView e RecyclerView:

http://www.thiengo.com.br/listview-entendendo-e-utilizando-no-android
http://www.thiengo.com.br/simpleadapter-no-listview-entendendo-e-utilizando-no-android
http://www.thiengo.com.br/utilizando-baseadapter-para-personalizacao-completa-da-listview
http://www.thiengo.com.br/carregando-dados-no-listview-com-onscrolllistener-e-volley-no-android

http://www.thiengo.com.br/recyclerview-material-design-android-parte-2
http://www.thiengo.com.br/animacao-onlongpress-e-gridlayoutmanager-em-recyclerview-material-design-android-parte-3

Jose Carlos, não deixe de ler os comentários dos artigos / vídeos que indiquei acima, até mesmo os do YouTube, se possível, pois esses é que muitas vezes vão sanar suas dividas.

Abraço.
Responder
22/10/2016
bom dia thiengo, gostaria de saber se tem como fazer um sistema de notificação direto da app utilizando firebase, tipo um usuário admin da app enviar sem ter que ter uma aplicação web.
Responder
Vinícius Thiengo (0) (0)
22/10/2016
Jasian, blz?

Sem um third-party server ainda não implementei, tenho que estudar o FCM um pouco mais.

Mas dessa forma, de APP para APP diretamente, provavelmente, não será possível, somente se o Firebase permitir acesso ao servidor deles por meio da API, digo, o servidor que permiti notificações também via Firebase dashboard, como fiz nesse artigo / vídeo: http://www.thiengo.com.br/notificacao-de-engajamento-pelo-firebase-console-parte-12

Para enviar as notificações são necessários os IDs gerados para cada device únicos a eles na APP que envia notificação, sem um servidor, a princípio, isso não é possível.

Mas é aquilo, é continuar pesquisando para saber se não existe já uma library que de alguma forma permite isso. Abraço
Responder
Weverto Gonçalves (1) (0)
20/10/2016
Olá Thiengo. Só para registrar meus agradecimentos pelos conteúdos. Valeu mesmo brother !!!
Responder
Vinícius Thiengo (0) (0)
21/10/2016
Mt obrigado Weverto. Forte abraço
Responder
01/10/2016
Thiengo, observo que a notificação só é recebida quando o aplicativo está em segundo plano. Tempo como o usuário receber a notificação com o aplicativo fechado, sem ter que está aberto em segundo plano?
Responder
Vinícius Thiengo (1) (0)
01/10/2016
Alberto, blz?
Fiz o teste aqui, com a APP fechada (sem ainda estar em segundo plano) e funcionou sem problemas. Se não me engano até mesmo no vídeo fiz esse teste.

Baixe a versão que do projeto no GitHub (https://github.com/viniciusthiengo/one-signal-notification) e veja se funciona ok ai para ti. Veja se as configurações de seu project estão corretas. Abraço
Responder
03/10/2016
Thiengo, na primeira vez que fiz o código tava certo. Vi o que você colocou no GitHub está da mesma forma. Continua a mesma coisa. Se o app estiver aberto ou aberto em segundo plano o celular recebe a notificação, se tiver fechado ele não notifica. No OneSignal, mostra que foi enviado, mas não notifica no celular. Se estiver aberto e primeiro ou em segundo notifica. Por favor tentar dar uma forma ai. Vou mandar o código para vc tentar me dar uma luz.



Manifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="albertobezerra.notificao">

    <application
        android:allowBackup="true"
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:name=".onesignal">

        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


    </application>

</manifest>



<<<<Os Javas>>>>>

MainActivity>>>

package albertobezerra.notificao;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;


public class MainActivity extends AppCompatActivity {
    //AIzaSyDtG6OoVb8RhxtymPgw1cmslLp85on52zg
    //876342969650
    //6bc210e4-bc07-4070-9ee7-f2da20f2476c

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}


<<<<< onesignal >>>>

package albertobezerra.notificao;

import android.app.Application;

import com.onesignal.OneSignal;

public class onesignal extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        OneSignal.startInit(this).init();
    }
}


<<<<Layout>>>>

activity_main

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="albertobezerra.notificao.MainActivity">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">


        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:srcCompat="@drawable/icon"
            android:id="@+id/imageView"
            android:layout_centerVertical="true"
            android:layout_centerHorizontal="true" />
    </RelativeLayout>


</android.support.design.widget.CoordinatorLayout>


<<<Build.grandle (Module APP)>>>

apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.3"
    defaultConfig {
        applicationId "albertobezerra.notificao"
        manifestPlaceholders = [manifestApplicationId: "${applicationId}",
                                onesignal_app_id: "6bc210e4-bc07-4070-9ee7-f2da20f2476c",
                                onesignal_google_project_number: "876342969650"]
        minSdkVersion 14
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:24.2.1'
    compile 'com.android.support:design:24.2.1'
    testCompile 'junit:junit:4.12'

    compile 'com.onesignal:OneSignal:3.+@aar'
    // Required for OneSignal, even if you have added FCM.
    compile 'com.google.android.gms:play-services-gcm:+'
    // Required for geotagging
    compile "com.google.android.gms:play-services-location:+"
}


Espero que consiga me ajudar
Responder
Vinícius Thiengo (0) (0)
08/10/2016
Alberto,
Testei a pouco meu código com a mesma configuração do seu, digo, gradle e onesignal Application. Para API 16 e 23 (com Android 5) rodou sem problemas, mesmo com a APP não em background.

Ambos os testes foram feitos no emulador. Em qual versão do Android está realizando os testes, incluindo API e device?

A diferenças que vi de seu código para meu foram as chaves do OneSignal e Android e o buildToolsVersion onde o seu é "24.0.3" o meu é "24.0.2", mas não acredito que esse valor diferente de buildToolsVersion seja um problema.

Abraço
Responder
Leandro Souza (2) (0)
04/11/2016
Este problema, normalmente, ocorre porque não foi dada a permissão de auto-início para o aplicativo, meu telefone é da Asus e vem com um gerenciador de auto-início que, por padrão, nega tudo, o que faz as notificações não serem recebidas quando o aplicativo está fechado, mas é só usar o gerenciador de auto início para dar a permissão de auto-início ao aplicativo que as notificações funcionarão com o aplicativo aberto ou fechado.
Responder
Vinícius Thiengo (0) (0)
05/11/2016
Vlw o compartilhamento Leandro. Abraço
Responder
28/09/2016
Olá, muito bom o conteúdo.
Mas como faço pra implementar o onesignal ou o firebase notificações em um projeto já pronto feito no eclipse?

Abraços
Responder
Vinícius Thiengo (3) (0)
28/09/2016
Fala Paulo, blz?

No caso do Firebase, como não há doc para o Eclipse com ele, uma opção é instalar o Gradle no Eclipse (link abaixo) e então tentar utilizar o Firebase como no AndroidStudio.

Gradle Eclipse: http://www.vogella.com/tutorials/EclipseGradle/article.html

Já o OneSignal, na documentação de instalação dele há um trecho somente mostrando como fazer no Eclipse. Veja esse link: https://documentation.onesignal.com/docs/android-sdk-setup#section-eclipse

Abraço
Responder