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…”
Digite “Com.OneSignal” e selecione o plugin como demonstrado na imagem a seguir.
Selecione todos os projetos e clique no botão “Install”.
Firebase
Entre com uma conta da Google no Firebase e adicione um novo projeto.
Informe um nome para o seu projeto e o país, o Project ID será gerado automaticamente.
Em seguida selecione “Adicionar o Firebase ao seu aplicativo android”.
Informe o nome do pacote de sua aplicação android. Se o seu projeto android ainda não tem um nome do pacote, adicione.
O passo seguinte é ir em “Configurações do projeto”.
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.
OneSignal
Crie uma conta no site do OneSignal, não se preocupe, todo o serviço de Push disponibilizado é gratuito.
Adicione um novo projeto.
Informe um nome para o seu projeto no OneSignal.
Selecione “Google Android (GCM)”.
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.
Ignore os passos seguintes clicando no “x” que encontra-se no canto superior direito.
No menu lateral selecione “App Settings”.
No canto superior direito selecione “Keys & IDs”.
Guarde as informações do “OneSignal App ID” e “REST API Key”, pois iremos utiliza-los mais pra frente.
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
… | |
public App() | |
{ | |
InitializeComponent(); | |
MainPage = new DemoNotification.MainPage(); | |
OneSignal.Current.StartInit("Insert OneSignal App ID here").EndInit(); | |
} | |
protected override void OnStart() | |
{ | |
OneSignal.Current.RegisterForPushNotifications(); | |
} | |
… |
Android
No arquivo MainActivity.cs e dentro do método “OnCreate” inicialize o OneSignal.
MainActivity.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
… | |
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()); | |
} | |
… |
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="utf-8"?> | |
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
… | |
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); | |
} | |
… |
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…”
Selecione para quem tanto deseja enviar a mensagem.
Defina o titulo e o conteúdo da mensagem.
Selecione “Background data” se desejar que a mensagem chegue para os usuários que estejam com o app fechado.
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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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
Esse e todos os exemplos deste blog encontram-se disponíveis no GitHub.
Olá Juliano, parabéns pelo artigo.
Sabe se o teste de push funciona pelo emulador do Android?
Obrigado.
CurtirCurtir
Olá Marcio, obrigado.
Não, neste caso precisa ser um dispositivo físico mesmo.
Abraço
CurtirCurtir
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.
CurtirCurtir
Ah legal Marcio 🙂
CurtirCurtir
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.
CurtirCurtir
Não sei se o problema foi algum delay de longos minutos, mas agora funcionou. Obrigado pela atenção.
CurtirCurtir
Olá Marcio, não é para demorar muito não. Verifica se o device tinha conexão com a internet. Talvez possa ser isso.
CurtirCurtir
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.
CurtirCurtir
Olá Marcelo,
Da uma olhada nesse link, ele explica certinho como você pode utilizar o PromptLocation.
https://documentation.onesignal.com/v3.0/docs/location-triggered-event
Espero ter ajudado, abraço.
CurtirCurtir
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.
CurtirCurtir
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.
CurtirCurtir
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
CurtirCurtir
Hi, I don’t have answers.
If not working and you need an immediate solution, I recommend downloading the project in github and using this method to perform the conversion.
https://blogs.msdn.microsoft.com/premier_developer/2017/10/27/converting-pcl-portable-class-libraries-libraries-to-net-standard-class-libraries
I hope help
CurtirCurtir
Olá ajudou bastante o Tutorial. Como eu faço para recuperar o IDUser? preciso guarda-lo para enviar push individuais….. como faço???
CurtirCurtir
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.
CurtirCurtir
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
CurtirCurtir
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
CurtirCurtir
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
CurtirCurtir
Perguntei mas consegui descobrir…hehehe
Usando HandleNotificationOpened … agora estou tentando abrir diferentes paginas de acordo com os Pushs.
CurtirCurtir
Olá Marcelo, que bom que conseguiu. 😀
CurtirCurtir
Olá Marcelo,
Fico feliz em saber que o post está te ajudando…
De uma olhada nesse link, acho que ele vai te ajudar: https://documentation.onesignal.com/docs/links
CurtirCurtir
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 ?
CurtirCurtir
Olá Michel,
De uma olhada nesse link, acho que ele vai te ajudar: https://documentation.onesignal.com/docs/links
CurtirCurtir
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?
CurtirCurtir
Ps: as mensagens aparecem com status de “Delivered”… mas juro que não apareceu nada nos celulares. rsrs…
CurtirCurtir
Opa!
Bem, funcionou. Agora preciso enviar pelo app. rsrs…
CurtirCurtir
Olá Fábio…. Que bom que funcionou. Abraço
CurtirCurtir
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.
CurtirCurtir
Olá,
Experimenta dar uma olhada neste link aqui, ele pode te ajudar:
https://forums.xamarin.com/discussion/100788/java-lang-illegalargumentexception-already-added-lcom-google-android-gms-internal-zzpz
Espero ter ajudado.
CurtirCurtir
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
CurtirCurtir
Olá Ricardo, tudo bem e você ?
Verifique se você configurou a opção de background data no OneSignal. Espero ter ajudado.
CurtirCurtir
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..
CurtirCurtir
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
CurtirCurtir
Olá Luciano,
Para realização dos testes de Push é recomendado utilizar um dispositivo. Geralmente simuladores não funcionam para receber push do iOS,
CurtirCurtir
E quanto a Notification Service Extension, é necessário?
CurtirCurtir
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
CurtirCurtir
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
CurtirCurtido por 1 pessoa
Consegui, mas como faz pra notificação funcionar com ele fechado?
CurtirCurtir
Que bom que conseguiu… Selecione a opção background data no one signal.
Espero ter ajudado.
CurtirCurtido por 1 pessoa