OneSignal Push Notification – Xamarin.Forms

Olá, neste post irei demonstrar como você pode implementar Push Notification em sua aplicação Xamarin.Forms utilizando o OneSignal.

 

ADICIONANDO O NUGET PACKAGE

Clique com o botão direito em cima de sua Solution e selecione “Manage NuGet Packages for Solution…”

1.1

 

Digite “Com.OneSignal” e selecione o plugin como demonstrado na imagem a seguir.

1.2

 

Selecione todos os projetos e clique no botão “Install”.

1

Firebase

Entre com uma conta da Google no Firebase e adicione um novo projeto.

f1

 

Informe um nome para o seu projeto e o país, o Project ID será gerado automaticamente.

f2

 

Em seguida selecione “Adicionar o Firebase ao seu aplicativo android”.

f3

 

Informe o nome do pacote de sua aplicação android. Se o seu projeto android ainda não tem um nome do pacote, adicione.

f4

 

O passo seguinte é ir em “Configurações do projeto”.

f5

 

Em configurações selecione “Cloud Messaging”, guarde o Token da “Chave do servidor” e o Código do remetente, pois iremos utiliza-los mais pra frente.

f6

OneSignal

Crie uma conta no site do OneSignal, não se preocupe, todo o serviço de Push disponibilizado é gratuito.

Adicione um novo projeto.

o1

 

Informe um nome para o seu projeto no OneSignal.

o2

 

Selecione “Google Android (GCM)”.

o3

 

No campo “Google Server API Key” informe o token da Chave do Servidor adquirido no Firebase e no campo “Google Project Number” adicione o Código do remetente.

o5

 

Ignore os passos seguintes clicando no “x” que encontra-se no canto superior direito.

o6

 

No menu lateral selecione “App Settings”.

o7

 

No canto superior direito selecione “Keys & IDs”.

o7

 

Guarde as informações do “OneSignal App ID” e “REST API Key”, pois iremos utiliza-los mais pra frente.

o7

Portable

Na classe App, dentro do método de inicialização, inicialize o OneSignal e no método “OnStart” chame o “RegisterForPushNotifications”, ambos demonstrado a seguir:

Substitua o texto “Insert OneSignal App ID here” pelo APP ID que se encontra no OneSignal.

App.xaml.cs


public App()
{
InitializeComponent();
MainPage = new DemoNotification.MainPage();
OneSignal.Current.StartInit("Insert OneSignal App ID here").EndInit();
}
protected override void OnStart()
{
OneSignal.Current.RegisterForPushNotifications();
}

view raw

App.xaml.cs

hosted with ❤ by GitHub

Android

No arquivo MainActivity.cs e dentro do método “OnCreate” inicialize o OneSignal.

MainActivity.cs


protected override void OnCreate(Bundle bundle)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(bundle);
OneSignal.Current.StartInit("Insert OneSignal App ID here").EndInit();
global::Xamarin.Forms.Forms.Init(this, bundle);
LoadApplication(new App());
}

view raw

MainActivity.cs

hosted with ❤ by GitHub

 

No arquivo AndroidManifest.xml adicione as Tags “permission”, “uses-permission” e “application” como demonstrado a seguir:

Substitua o texto “{InsertPackageNameHere}” pelo Package Name da sua aplicação andorid.

AndroidManifest.xml


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android&quot; package="{InsertPackageNameHere}" android:installLocation="auto">
<uses-sdk android:minSdkVersion="15" />
<permission android:name="{InsertPackageNameHere}.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="{InsertPackageNameHere}.permission.C2D_MESSAGE" />
<application android:label="DemoNotification.Android">
<receiver android:name="com.onesignal.GcmBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="{InsertPackageNameHere}" />
</intent-filter>
</receiver>
</application>
</manifest>

iOS

No AppDelegate.cs dentro do método “FinishedLaunching” inicialize o OneSignal.

AppDelegate.cs


public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
global::Xamarin.Forms.Forms.Init();
LoadApplication(new App());
OneSignal.Current.StartInit("Insert OneSignal App ID here").EndInit();
return base.FinishedLaunching(app, options);
}

view raw

AppDelegate.cs

hosted with ❤ by GitHub

iOS Push Certificate

Para a plataforma iOS é necessário gerar um certificado com a sua conta de desenvolvedor da Apple. Veja como fazer isso aqui: Generate an iOS Push Certificate

Enviar uma mensagem

No Dashboard de sua aplicação no OneSignal, selecione “New push notification…”

send1

 

Selecione para quem tanto deseja enviar a mensagem.

send2

 

Defina o titulo e o conteúdo da mensagem.

send3

 

Selecione “Background data” se desejar que a mensagem chegue para os usuários que estejam com o app fechado.

send5

Em segue selecione next.

Enviar uma mensagem por outra aplicação

Caso você tenha uma aplicação para disparar o push notification, você pode montar um json com as configurações da mensagem, como o exemplo a seguir:


{
"app_id": "ID DO ONESIGNAL",
"included_segments": ["All"],
"data": {"foo": "bar"},
"subtitle": {"en": "Titulo para ios 10 ou superior"},
"headings": {"en": "Titulo"},
"contents": {"en": "Mensagem"}
}

Para saber outras formas de sua aplicação disparar o push notification, clique aqui.

Resultado

ezgif.com-gif-maker (1)

 

 

Esse e todos os exemplos deste blog encontram-se disponíveis no GitHub.

icongithub

40 comentários em “OneSignal Push Notification – Xamarin.Forms

      1. Olá Juliano, apenas para deixar registrado que consegui usar o push no emulador (testei apenas no Genymotion). Para funcionar, é necessário que tenha instalado a última versão do Google Play na VM do Android.

        Curtir

  1. Ok! Meu device já aparece no menu “All users” como ativo (selecionei a opção background data)

    No Delivery Statistics aparece:
    Total Messages 1
    Pending 1

    Apesar do app estar aberto ainda não recebi, saberia dizer se existe alguma configuração ou procedimento extra que dispare de fato o Push ou foi demorado para você também?

    Obrigado.

    Curtir

    1. Não sei se o problema foi algum delay de longos minutos, mas agora funcionou. Obrigado pela atenção.

      Curtir

    2. Olá Marcio, não é para demorar muito não. Verifica se o device tinha conexão com a internet. Talvez possa ser isso.

      Curtir

  2. Olá. Fiz um teste e funcionou…pesquisando mais a fundo, vi a opção de adicionar Location Point ao One Signal. Mas utilizando o comando OneSignal.Current.PromptLocation() nada acontece no painel do One SIgnal. Diferente de quando uso SendTag, aí posso criar um atributo de localização, por exemplo. Mas gostaria de usar o location point dele…se souber como, agradeço.

    Curtir

  3. Juliano, Boa Noite Amigo!
    Primeiramente gostaria de agradecer por este mais este POST!
    Após atualizar meu Projeto compartilhado para trabalhar com .NET Standard 2.0, o OneSignal parou de funcionar. Em pesquisas na Internet ainda não encontrei a solução. Saberia informar se existe alguma configuração adicional para que o OneSignal funcione com o .NET Standard 2.0 ?
    Aguardo por seu contato ok!
    Abs.

    Curtir

    1. Olá Wallace,

      Acabei de verificar que a biblioteca não possui atualizações para o .NET Standard 2.0 ainda.

      Porem, eu criei um projeto .NET Standard 2.0 e testei a biblioteca e ela funcionou normalmente. Apenas apresentou uma mensagem de alerta de compatibilidade, mas funcionou.

      De qualquer forma irei entrar em contato com o pessoal para saber sobre a atualização.

      Experimente instalar novamente a biblioteca ou fazer o teste em um projeto novo separado para ver se não afetou algum arquivo no momento da sua atualização.

      Qualquer dúvida estou a disposição.

      Curtir

  4. Hi, did you had a chance to contact OneSignal team? any updates from them? their xamarin sdk needs to update to support .Net Standard as well as Android API 26. Currently its not working on Oreo. Its sad not being able to use such great service. seems they are not maintaining xamarin sdk

    Curtir

  5. Olá ajudou bastante o Tutorial. Como eu faço para recuperar o IDUser? preciso guarda-lo para enviar push individuais….. como faço???

    Curtir

    1. Olá Jader, fico feliz em saber que te ajudou.

      Utilize o exemplo a seguir, qualquer dúvida entre em contato comigo pela sessão contatos que eu te ajudo.

      Abraços.

      Curtir

  6. Ola Juliano não sei se o primeiro comentário foi registrado mas se não vai esse, parabéns pelo post muito bom, só que no meu caso deu um erro que não consigo resolver:error: package com.google.android.gms.tasks does not exist

    Meu projeto é Xamarin.Forms .NET Standard 2.0

    Sabe me dizer se existe alguma solução ??

    Abraço

    Curtir

    1. Olá Rafael, obrigado.

      Experimente dar um downgrade nos pacotes do GooglePlayServices. Pois o OneSignal normalmente não funciona perfeitamente com as versões mais recentes.
      Neste exemplo com a essa versão do OneSignal, experimente utilizar a versão 60.1142.1 dos pacotes do GooglePlayServices.

      Espero ter ajudado.

      Abraço

      Curtir

  7. Boa tarde Juliano. Estou no 2º app usando push baseado em seu tutorial. Obrigado…
    Como fazer pra quando clicar no push, abrir alguma pagina específica do app ou escolher o que fazer? Abraço

    Curtir

    1. Perguntei mas consegui descobrir…hehehe

      Usando HandleNotificationOpened … agora estou tentando abrir diferentes paginas de acordo com os Pushs.

      Curtir

  8. Opa Juliano tudo bom? Então estou tentando montar um push no onesignal que ao clicar direcionasse a uma page especifica no meu aplicativo.. pode me ajudar ?

    Curtir

  9. Boa noite meu caro!!

    Antes de qualquer coisa… Obrigado pelo artigo!

    Vamos lá:

    Fiz o passo-a-passo e no OnSignal identifica os dispositivos com a aplicação corretamente. Assim, acredito que eu tenha feito tudo certo.
    Depois de algumas tentativas de envio pelo site e uma hora depois… nenhuma das 4 mensagens foram recebidas.

    As perguntas que não querem calar (risos): Onde eu posso ter feito a bagunça sendo que o OnSignal reconhece os dispositivos? Como debugar? Pode me ajudar?

    Curtir

    1. Ps: as mensagens aparecem com status de “Delivered”… mas juro que não apareceu nada nos celulares. rsrs…

      Curtir

  10. Olá Juliano, bom dia.
    Recebo o seguinte erro:
    java.lang.IllegalArgumentException: already added : Lcom/google/android/gms/iid/MessengerCompat; MasterDetailDemo.Android

    Sabe o que pode ser? Não encontro solução.

    Obrigado.

    Curtir

  11. Oi Juliano, tudo bom ?
    As mensagens chegam corretamente porém só quando o APP esta aberto. Alguma ideia do que pode ser?
    Estou testando usando um projeto compartilhado e usando MotoG 6 Android 8

    Curtir

    1. Olá Ricardo, tudo bem e você ?
      Verifique se você configurou a opção de background data no OneSignal. Espero ter ajudado.

      Curtir

  12. Olá Juliano

    estou utilizando o onesignal para um projeto xamarin.forms Android e IOS, para android está funcionando perfeitamente, porém para IOS fiz todos os passos do tutorial, porém ao inicializar o app no simulador tanto windows ou no mac o app inicializa mostra o splash dele e logo fecha. Inicialmente achei que era por não ter ainda o certificado para push notification, aí comentei os fontes a parte do onesignal para dar continuidade no app (comentando os comandos do onesignal o app faz tudo) e deixar isto para o fim. Bom cheguei no fim do app, gerei o certificado e mesmo assim o problema continua, saberia o que pode ser? Ou ideia do que eu poderia me nortear para resolver..

    Curtir

    1. Consegui resolver o problema com o código abaixo

      [Export (“oneSignalApplicationDidBecomeActive:”)]
      public void OneSignalApplicationDidBecomeActive(UIApplication application) {
      Console.WriteLine (“oneSignalApplicationDidBecomeActive:”);
      }

      Fonte: https://stackoverflow.com/questions/35761082/issue-with-onesignal-and-xamarin-ios

      Porém, fiz o certificado gerado pelo onesignal mesmo, pois ele tem uma ferramenta que gera na minha conta desenv, vinculei o certificado na minha conta onesignal, porém não consigo testar as mensagens, envio e não recebo nada, já fiz tudo aquilo que tem que fazer nos arquivos Entitlemetents.plist e no info.plist para liberar no app e nada.

      Li também que poderia ser por estar em modo debug, que a partir de alguns visual studio mais novos estaria enviando somente no modo release, rodei no modo run without debug e também não rolou

      OBS.: Estou usando o simulador no macincloud para testar o app

      outro detalhe que tentei, na documentação do onesignal do link abaixo, fala em criar para IOS uma Notification Service Extension, seria necessário? Pois no teu exemplo não fala disso..

      https://documentation.onesignal.com/docs/xamarin-sdk-setup

      Obrigado

      Curtir

      1. Olá Luciano,

        Para realização dos testes de Push é recomendado utilizar um dispositivo. Geralmente simuladores não funcionam para receber push do iOS,

        Curtir

  13. sou novo no xamarin, o que seria : {InsertPackageNameHere}” pelo Package Name da sua aplicação andorid. Aonde identifico o Package Name da minha aplicação, e pq o DemoNotification nao encontra aparece erro

    Curtir

    1. Se você clicar com o botão direito em cima do seu projeto e selecionar propriedades, você irá encontrar o package name do seu projeto.

      Espero ter ajudado

      Curtido por 1 pessoa

Deixe um comentário