O Android suporta notificação por push quase em tempo real?

343

Recentemente, aprendi sobre a capacidade dos aplicativos do iPhone de receber notificações quase instantâneas para notificações de aplicativos .

Isso é fornecido na forma de notificações por push, um protocolo sob medida que mantém uma conexão de dados sempre ativa no iPhone e envia pacotes binários para o aplicativo, que exibe alertas incrivelmente rapidamente, entre 0,5 e 5 segundos entre o servidor e o aplicativo. tempo de resposta. Isso é enviado como dados - em vez de SMS - em pacotes muito pequenos, cobrados como parte do plano de dados e não como mensagens recebidas.

Gostaria de saber se, usando o Android, existe um recurso semelhante ou se é possível implementar algo parecido com isso usando as APIs do Android. Para esclarecer, defino similar como:

  • Não é uma mensagem SMS, mas alguma solução orientada a dados
  • O mais real possível
  • É escalável, ou seja, como parte do servidor de um aplicativo móvel, eu poderia notificar milhares de instâncias de aplicativos em segundos

Aprecio que o aplicativo possa ser baseado em pull, estilo de solicitação / resposta HTTP, mas, idealmente, não quero fazer pesquisas tão pesadas apenas para verificar a notificação; além do que é como pingar drenando o plano de dados.

j pimmel
fonte
3
A notificação para o gmail e o gchat geralmente está dentro desse limite. Deve haver uma maneira de replicar isso em seu próprio aplicativo.
Dana the Sane #
Sim, há uma biblioteca android que faz empurrar mensagens muito simples ... basta incluir Droid Notificações de Jigy biblioteca em sua aplicação e de lá é apenas sobre 10 linhas de código ... espero que isso ajude :)
Corey Harden
Confira o Pushy ( pushy.me ) para obter um gateway de notificação por push em tempo real que usa o MQTT sob o capô para aumentar a confiabilidade. Divulgação completa - fundei Pushy.
Elad Nava

Respostas:

215

O Firebase Cloud Messaging FCM é a nova versão do GCM. Ele herda a infraestrutura principal do GCM para entregar mensagens de forma confiável no Android, iOS e Chrome. No entanto, eles continuarão a oferecer suporte ao GCM, porque muitos desenvolvedores estão usando os SDKs do GCM hoje para lidar com notificações, e a atualização do aplicativo cliente leva tempo.

Em 26 de junho de 2012, o Google Cloud Messaging é a maneira preferida de enviar mensagens para aplicativos em execução em dispositivos.

Anteriormente (e agora descontinuado), o serviço era chamado de Cloud to Device Messaging .

j pimmel
fonte
14
O Google fornece documentação detalhada para implementar isso no seu aplicativo Android em Java em code.google.com/android/c2dm, mas seu código de exemplo para comunicação com o aspecto do servidor do C2DM está ausente. Eu escrevi um tutorial para esse aspecto aqui: blog.boxedice.com/2010/10/07/…
DavidM
2
Existe uma maneira de oferecer notificações por push para usuários com Android 2.2, mas tornar o mesmo aplicativo executável em distribuições mais antigas, apenas sem notificações por push?
OneWorld
3
@OneWorld: sim, assim como qualquer outra técnica de compatibilidade com versões anteriores do Android, usar o reflexo para pegar estratégia alternativa quando C2DM não estiver disponível, por mais ver: developer.android.com/resources/articles/...
Lie Ryan
11
developer.android.com/videos/index.html#v=PLM4LajwDVc Apresentação do Google I / O 2010 sobre as notificações por push
vokilam 02/02/11
6
C2DM foi oficialmente removida em 26 de junho de 2012, o uso [Google Cloud Messaging para Android] ( developer.android.com/guide/google/gcm/index.html vez
Mithun Sreedharan
47

XMPP é uma boa solução. Eu o usei para um aplicativo Android ativado por push, em tempo real. O XMPP é poderoso, altamente extensível e fácil de integrar e usar.

Existem muitos servidores XMPP gratuitos (embora, por cortesia, você não deva abusar deles) e existem servidores de código aberto que você pode executar em uma de suas próprias caixas. OpenFire é uma excelente escolha.

A biblioteca que você deseja não é o Smack, como mencionado acima, é o aSmack . Mas observe que este é um ambiente de construção - você terá que construir a biblioteca.

Este é um cálculo que fiz sobre o impacto na duração da bateria de uma solução XMPP:

O cliente Android deve manter uma conexão TCP persistente, ativando periodicamente para enviar uma pulsação ao servidor XMPP.
Isso impõe claramente um custo em termos de uso de energia. Uma estimativa desse custo é fornecida abaixo:

  • Usando uma bateria de 1400mAh (conforme fornecido no Nexus One e HTC Desire)
  • Um dispositivo inativo, conectado a uma rede 3G, usa aproximadamente 5mA
  • O ciclo de ativação, batimento cardíaco e sono ocorre a cada 5 minutos, leva três segundos para concluir e usa 300mA
  • O custo no uso da bateria por hora é, portanto:
    • 36 segundos 300mA = 3mAh enviando batimentos cardíacos
    • 3600 segundos 5mA = 5mAh em modo inativo
    • 4:95 + 3 = 7: 95mAh combinados
  • Uma bateria de 1400mAh dura aproximadamente 11,6 dias no modo inativo e 7,3 dias ao executar o aplicativo, o que representa uma redução aproximada de 37% na vida útil da bateria.
  • No entanto, uma redução de 37% na duração da bateria representa o pior caso absoluto na prática, uma vez que os dispositivos raramente ficam completamente ociosos.
carne
fonte
2
No entanto, na prática, o telefone dura 3 horas quando os aplicativos fazem isso, já que centenas de intenções são executadas quando o telefone é ativado ou o display é ligado ou o estado da rede é alterado.
Monstieur 17/02
33

Recentemente, comecei a jogar com o MQTT http://mqtt.org para Android como uma maneira de fazer o que você está solicitando (ou seja, não SMS, mas orientado por dados, entrega quase imediata de mensagens, escalável, sem polling etc.)

Tenho uma postagem no blog com informações básicas sobre isso, caso seja útil http://dalelane.co.uk/blog/?p=938

(Nota: MQTT é uma tecnologia IBM e devo salientar que trabalho para IBM.)

dalelane
fonte
Como o mqtt está fazendo isso? Deve haver alguma pesquisa envolvida em algum lugar? Até mesmo a Apple tem de sondagem, mas eu acho que eles estão apenas fazendo uma conexão de cada vez, portanto, não esgotar a bateria que muito ...
Janusz
3
Faz isso abrindo uma conexão TCP / IP e deixando-a aberta. Ele não pesquisa, embora ocasionalmente precise enviar uma pequena mensagem de ping na conexão para mantê-la ativa.
dalelane
Definitivamente, o MQTT é o caminho a percorrer se o envio de sua mensagem de push pelo Google o deixa desconfortável. Além disso, temos acordos de confidencialidade com nossos clientes que proíbem o uso de serviços em nuvem para trocas de dados.
VH-NZZ 04/02
14

Dê uma olhada na plataforma Xtify . Parece que é isso que eles estão fazendo,

Pedro
fonte
8

Se você pode confiar que as bibliotecas do Google estão lá para o seu mercado-alvo, convém refazer a funcionalidade do GTalk (registrando um recurso no nome de usuário existente - interceptando as mensagens quando elas chegam com um BroadcastReceiver).

Se não, e espero que você não possa , então você está agrupando suas próprias versões do XMPP . Isso é complicado, mas pode ser mais fácil se o XMPP for incluído separadamente como uma biblioteca independente.

Você também pode considerar o PubSubHubub , mas não faço ideia do uso da rede. Eu acredito que é construído no topo do XMPP.

jamesh
fonte
Eu acho que as estatísticas do artigo de que a funcionalidade de piggy back estarão sempre disponíveis enquanto as bibliotecas gtalk estiverem no dispositivo. Você tem alguns recursos com exemplos de como realmente fazer isso?
Janusz
O GTalk é removido do SDK desde 1.0 (iirc).
MrSnowflake
8

Eu estive investigando isso e o PubSubHubBub recomendado por jamesh não é uma opção. O PubSubHubBub é destinado a comunicações servidor a servidor

"Estou atrás de um NAT. Posso assinar um hub? O hub não pode se conectar a mim."

/Anônimo

Não, o PSHB é um protocolo de servidor para servidor. Se você está atrás do NAT, não é realmente um servidor. Embora tenhamos discutido idéias sobre extensões opcionais do PSHB para pendurar gets ("long polling") e / ou messagebox para esses clientes, ela não está na especificação principal. A especificação principal é apenas de servidor para servidor.

/ Brad Fitzpatrick, São Francisco, CA

Fonte: http://moderator.appspot.com/#15/e=43e1a&t=426ac&f=b0c2d (link direto não possível)

Cheguei à conclusão de que o método mais simples é usar o push HTTP do cometa. Essa é uma solução simples e bem compreendida, mas também pode ser reutilizada para aplicativos da Web.

Morgan Christiansson
fonte
8

Há um novo esforço de código aberto para desenvolver uma biblioteca Java para notificações push no Android, usando o servidor meteoro Meteor como back-end. Você pode conferir no Deacon Project Blog . Precisamos de desenvolvedores, então, espalhe a palavra!

mtbkrdave
fonte
7

O Google anunciou recentemente (18 de maio de 2016) que o Firebase agora é sua plataforma unificada para desenvolvedores de dispositivos móveis, incluindo notificações push quase em tempo real.

A empresa agora oferece a todos os usuários do Firebase notificações gratuitas e ilimitadas, com suporte para iOS, Android e Web.

fonte

Freek Nortier
fonte
6

Não consigo encontrar onde o leio, mas acredito que o gmail utiliza uma conexão TCP aberta para fazer o envio por email.

Vai
fonte
Há uma postagem no blog em joelapenna.com/blog/2009/07/android-foursquare-and-push por um desenvolvedor de um aplicativo Android que parece suportar isso.
Dalelane 5/10/09
Parece-me que eles também estão votando. O dispositivo móvel faz uma conexão com o servidor e notifica o servidor que está aguardando atualizações. Impulso real é iniciada pelo servidor, que é muito difícil para dispositivos móveis, e na maioria das vezes envolve o apoio provedor de rede (sms / push wap) ...
MrSnowflake
11
"O C2DM permite que desenvolvedores terceirizados usem o mesmo serviço que os aplicativos do Google." do Android Nuvem Para dispositivo de mensagens
colithium
6

Como GTalksaiu do SDK, pode ser uma boa ideia criar um sistema de mensagens push 'padrão'. Dessa forma, apenas um serviço precisa ser executado, apenas uma conexão TCP extra precisa estar aberta. Os aplicativos devem conversar com este serviço usandoIntents e devem primeiro solicitar permissão para enviar e receber notificações do serviço. O serviço deve notificar o usuário de que um novo aplicativo deseja enviar e receber mensagens. O usuário concederá ou negará permissão e permanecerá no controle. O aplicativo registrará uma ação + categoria no serviço, para que o serviço saiba como entregar a mensagem enviada.

Seria uma boa ideia ou não?

MrSnowflake
fonte
6

Por que você não vai com a implementação do XMPP. No momento, existem tantos servidores públicos disponíveis, incluindo gtalk, jabber, cidadela etc. Para o Android, existe um SDK também disponível, chamado SMACK. Não podemos dizer uma notificação por push, mas usando o XMPP, você pode manter uma conexão aberta entre cliente e servidor, o que permitirá uma comunicação bidirecional. Significa que o cliente e o servidor Android podem se comunicar. No momento, isso atenderá à necessidade do Push no Android. Eu implementei um código de exemplo e ele realmente funciona muito bem

Rahul Patel
fonte
Gostaria de fornecer um link para o seu código de exemplo? Realizou algum teste com relação à duração da bateria?
Alex
Eu testei a duração da bateria - o batimento cardíaco que você precisa enviar a cada seis minutos reduz a duração da bateria em 30% na pior das hipóteses (por exemplo, o dispositivo apenas acorda para enviar um batimento cardíaco). Na melhor das hipóteses (o usuário está usando o dispositivo para navegar, fazer chamadas etc.), o impacto na vida útil da bateria é insignificante.
carne
6

Eu desenvolvi recentemente http://pushdroid.org, é um aplicativo único que deve ser instalado no telefone, assim como o google o implementou no 2.2. Isso funciona a partir da 1.5 e está sendo transmitido via intenção.

Stefan
fonte
4

O problema com o GCM é que há muita configuração envolvida no processo:

  • Você precisa adicionar muitos clichês no seu aplicativo para Android
  • Você precisa configurar um servidor externo para se comunicar com o servidor GCM
  • Você terá que escrever testes

Se você gosta de coisas simples (como eu), tente o UrbanAirship . É (IMHO) a maneira mais fácil de usar o GCM no seu aplicativo sem fazer muita configuração. Também fornece uma GUI bonita para testar se as mensagens do GCM estão sendo entregues corretamente.

  • Você pode encontrar os documentos e o guia de primeiros passos aqui
  • Você pode encontrar um aplicativo de amostra aqui

Nota: Eu não sou afiliado à UrbanAirship de forma alguma

fernandohur
fonte
2

Eles têm seus ouvintes, que devem ser usados ​​por você usando as classes de bibliotecas no seu código. Você não precisa se preocupar em empurrar. Você deve enviar a mensagem ao servidor, o servidor enviará a mensagem ao dispositivo. Eles usam OAuth. Em relação aos protocolos, existem dois métodos usando o CCS e o XMPP. O CCS apenas usa o XMPP como uma camada de transporte autenticada, para que você possa usar a maioria das bibliotecas XMPP para gerenciar a conexão. Para enviar notificações para o dispositivo, você pode escrever o código no aplicativo Android para enviar, bem como o código do servidor. o envio da mensagem será feito apenas pelo seu código. O resto será tratado pelo Google Server no caso do GCM. Você pode verificar os detalhes neste link

http://developer.android.com/google/gcm/server.html

Além disso, por questões de segurança

segurança de mensagens da nuvem do Google https://groups.google.com/forum/#!topic/android-gcm/M-EevBitbhQ

Caso seu aplicativo não esteja em execução, os dispositivos também podem receber notificações, pois é necessário escrever um código para os ouvintes de transmissão. Em segundo plano, ele estará ouvindo o servidor e, sempre que houver algum pacote de mensagens, ele receberá a mensagem como notificação. Android tem serviço que você precisa para não se preocupar com isso. Você só precisa usar esses recursos usando a classe de biblioteca que facilita o seu trabalho e permitir que eles escrevam se o aplicativo não estiver em execução e também receberá notificações. Obviamente, haveria algum ouvinte que fizesse com que o aplicativo recebesse. Marque a seção "Receber a mensagem" neste link

http://developer.android.com/google/gcm/client.html

Ele também aceitará solicitações de usuários. Para o GCM, ele serve. Marque "Enviar uma mensagem"

http://developer.android.com/google/gcm/client.html

ajitksharma
fonte