Enviando notificações de push a dispositivos iOS

Entregue conteúdo rico diretamente a aplicativos iOS

Usando a tecnologia de notificação de push, os aplicativos de servidor podem enviar conteúdo rico a aplicativos instalados em dispositivos iOS ou Android, evitando o problema e o gasto da implementação de Short Message Service (SMS) ou Multimedia Messaging Service (MMS) em seu aplicativo de sistema de mensagens móvel. Michael Yuan mostra como suportar este recurso principal em seus aplicativos iOS. Você também verá como usar uma biblioteca Java livre que simplifica o processo de notificação.

Michael Juntao Yuan, Chief Scientist, Ringful Health

O Dr. Michael Yuan é tecnólogo renomado na área de computação corporativa e tecnologias móveis para o consumidor. É autor de cinco livros sobre engenharia de software e publicou mais de quarenta artigos tanto em journals do segmento de mercado como em publicações revisadas por pares. O Dr. Yuan é pioneiro na área emergente da assistência médica baseada no consumidor. Seu trabalho na Ringful Health é amplamente divulgado e reconhecido em meios de comunicações de âmbito nacional nos EUA, como o Wall Street Journal, o New York Times, e Los Angeles Times.



15/Mar/2012

Plano de fundo

Mensagens SMS e MMS são entregues por transportadoras wireless a dispositivos específicos via números de telefone. Os desenvolvedores de aplicativos do lado do servidor que implementam o sistema de mensagens SMS/MMS devem chegar a ótimas durações para interagir com a infraestrutura existente fechada de telecomunicações—incluindo a obtenção de números de telefone. (Leia mais detalhes sobre o desenvolvimento de aplicativos do lado do servidor SMS/MMS em "Build mobile messaging into your web apps.") As mensagens SMS/MMS não têm noção dos aplicativos instalados no dispositivo do destinatário.

A popularidade de supersmartphones como dispositivos iPhone e Android (e seus primos Wi-Fi, como iPod Touch e iPad) criou uma necessidade de uma infraestrutura moderna de sistema de mensagens móvel que pode entregar informações ricas em mídia diretamente a aplicativos instalados—em vez de números de telefone—e isso é mais aberto e menos caro que SMS/MMS.

Mensagens de Duas Vias

Um dos grandes recursos da infraestrutura SMS/MMS é que os aplicativos de servidor podem receber e responder a mensagens enviadas de telefones. O sistema de mensagens push, por outro lado, é de uma via: é possível enviar mensagens apenas de seu servidor aos aplicativos em um dispositivo. Mas esse não é o maior problema. Em vez de os usuários "digitarem XYZ a 12345 para receber informações, " é possível dizer-lhes que "façam download do aplicativo XYZ para receber informações." E os próprios aplicativos podem fazer upload de conteúdo para o seu servidor diretamente quando necessário, eliminando qualquer necessidade de enviar mensagem ao servidor.

A Apple e o Google tomaram uma posição frente ao desafio desenvolvendo uma infraestrutura baseada em Internet que pode entregar mensagens aos dispositivos iOS e Android, respectivamente, de aplicativos de servidor. Notificações push são projetadas da base para comunicar-se com aplicativos instalados em dispositivos móveis. Elas podem enviar texto, arquivos de mídia e dados específicos do aplicativo como sons de alerta e sinais para exibir no ícone do aplicativo.

Este artigo explica como a tecnologia de notificação push funciona na plataforma iOS e como incorporá-la em seus aplicativos. Para obter o máximo do artigo, você deve ter um pouco de experiência em desenvolvimento iOS e Java.


Fundamentos de Push de iOS

A Apple usa certificados digitais de chave pública para autenticar solicitações de push de seu aplicativo iOS, então, primeiro é necessário criar chaves de autenticação e registrá-las com Apple. Tratarei deste processo direto, porém demorado na próxima seção.

Em seguida, cada dispositivo que instala o aplicativo e opta por receber notificações de push para esse aplicativo precisa ser identificado. A sequência funciona assim:

  1. Um diálogo de alerta no aplicativo iOS solicita a permissão do usuário para receber notificações de push.
  2. Se o usuário conceder permissão, o aplicativo iOS entra em contato com o Apple Push Notification service (APNs) para obter uma cadeia de caractere de ID que identifica exclusivamente este aplicativo instalado neste dispositivo. (É possível pensar no ID como análogo ao número de telefone do destinatário em um cenário tradicional de sistema de mensagens.)
  3. O aplicativo iOS faz upload do ID para seu aplicativo de servidor.
  4. Quando o aplicativo do servidor precisar enviar uma mensagem de push, ele é autenticado em relação a servidores de push da Apple e depois usa o ID das etapas 2 e 3 para especificar o destinatário da mensagem.
  5. Se o dispositivo do destinatário estiver on-line, ele recebe e processa a mensagem. Se o dispositivo estiver off-line, a mensagem é enfileirada e depois entregue da próxima vez que o dispositivo estiver on-line.

Uma alternativa para seu próprio servidor: Urban Airship

Urban Airship é um serviço que permite fazer push de mensagens sem precisar executar seu próprio servidor (consulte Recursos). Você faz upload de suas chaves privadas no Urban Airship e usa seu console de sistema de mensagens baseado na web para fazer push de mensagens para seus usuários. O Urban Airship fornece um SDK iOS que facilita ao seu aplicativo o registro de cada dispositivo instalado com seu servidor de forma que esses dispositivos apareçam no console de sistema de mensagens. Embora o Urban Airship simplifique o trabalho para você, pode ser caro —e você ainda precisa entender os conceitos básicos de notificação de push.

Os APNs também permitem que seus aplicativos de servidor validem sua lista armazenada de IDs de aplicativos periodicamente. Isso dá a oportunidade de remover os IDs dos usuários que excluem posteriormente o aplicativo ou alteram seu status de opção de push.

Isso soa provavelmente como muito trabalho e é. É por isso que serviços como o Urban Airship (consulte a barra lateral) existem para mensagens a uma taxa.

Após mostrar como registrar seu aplicativo, eu entrarei em detalhes do desenvolvimento de um aplicativo de notificação de push do iOS e, com a ajuda de uma biblioteca Java aberta, seus componentes de servidor.


Registrando o Aplicativo

Para registrar seu aplicativo para notificação de push, primeiro é necessário criar um par de chaves privadas/públicas para autenticar suas chamadas de API em relação aos servidores APNs. É possível fazer isto no Mac pelo aplicativo KeyChain Access. Selecione KeyChain Access > Certificate Assistant > Request a Certificate from a Certificate Authority para criar um arquivo de solicitação de assinatura de certificado. O arquivo de solicitação contém o par de chaves públicas geradas e a chave privada correspondente é salva no KeyChain Access. Certifique-se de selecionar a opção Saved to disk na caixa de diálogo, como mostrado na Figura 1:

Figura 1. Gerando um par de chaves e assinando a partir do programa KeyChain Access no Mac
Gerando um par de chaves e assinando a partir do programa KeyChain Access no Mac

Em seguida, efetue login no portal de fornecimento de aplicativos da Apple (consulte Recursos) e faça o upload de seu arquivo de solicitação de assinatura, que será associada ao perfil de fornecimento apropriado. A maioria dos aplicativos possui um perfil de fornecimento de desenvolvimento para testadores e um perfil de produção para a App Store, então mais provavelmente, você gerará e fará upload de duas solicitações de assinatura. Após fazer upload da solicitação de assinatura, o portal gera um certificado digital para que você faça o download. O certificado contém a chave pública, que o APNs agora reconhece como associado ao seu aplicativo. A Figura 2 mostra um exemplo:

Figura 2. Certificado Digital da Apple
Certificado Digital da Apple

Faça download do certificado digital e clique duas vezes no arquivo transferido por download. O KeyChain Access agora importa automaticamente o certificado digital e o associa à chave privada gerada ao criar a solicitação de assinatura. A Figura 3 mostra um par de chaves pública e privada no KeyChain Access:

Figura 3. Par de chaves pública e privada no KeyChain Access
Par de chaves pública e privada no KeyChain Access

Agora, você exporta o par de chaves para um arquivo usando um formato chamado Personal Information Exchange (p12). Quando criar o arquivo p12, o KeyChain Access solicita designar uma senha para proteger a chave privada. É possível usar uma senha vazia se desejar.

A partir deste ponto, todas as suas solicitações API aos servidores push APNs devem ser criptografadas pela chave privada no arquivo p12 e, depois, digitalmente assinadas pela chave pública no arquivo p12 para verificar se a chamada da API é realmente gerada por você. Demonstrarei como usar as chaves posteriormente no artigo, quando descrever como interagir com servidores de APNs. (Se usar o Urban Airship, ele pedirá que faça o upload do arquivo p12 com qualquer senha para seu servidor de modo que possa enviar mensagens de push em seu nome.)

Agora, que possui certificados push, você deve fazer download novamente e reinstalar seus perfis de fornecimento de aplicativos—porque os perfis agora são atualizados para suportar notificação de push para o aplicativo.


Solicitando e salvando um token de dispositivo

Seu aplicativo iOS precisa solicitar a permissão do usuário para receber notificações push nos dispositivos nos quais está instalado. Normalmente, isso é feito na delegação do aplicativo por meio de uma chamada de API simples, como mostrado na Listagem 1:

Listagem 1. Solicitando Permissão de Usuário
[[UIApplication sharedApplication]
    registerForRemoteNotificationTypes:
        (UIRemoteNotificationTypeBadge |
         UIRemoteNotificationTypeSound | 
         UIRemoteNotificationTypeAlert)];

Se o usuário conceder permissão, o aplicativo contatará automaticamente o servidor API para um token de dispositivo. O token permitirá que APNs identifiquem este determinado aplicativo instalado neste determinado dispositivo como um destino de mensagem. Este processo é automático e acontece no plano de fundo. Não é necessário gravar nenhum código para isso.

Após o servidor APNs responder, o método didRegisterForRemoteNotificationsWithDeviceToken na delegação de aplicativo é chamado, com o token de dispositivo passado como um parâmetro de chamada. Você deve salvar o token de dispositivo e fazer upload dele para seu próprio servidor de notificação de push, como mostrado na Listagem 2:

Listagem 2. Recebendo um ID e fazendo upload dele no servidor
- (void)application:(UIApplication*)application
         didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken {

    NSString *tokenStr = [deviceToken description];
    NSString *pushToken = [[[[tokenStr 
      stringByReplacingOccurrencesOfString:@"<" withString:@""] 
      stringByReplacingOccurrencesOfString:@">" withString:@""] 
      stringByReplacingOccurrencesOfString:@" " withString:@""] retain];

   // Save the token to server

   NSString *urlStr = [NSString stringWithFormat:@"https://%@/push_token", RINGFULDOMAIN];
    NSURL *url = [NSURL URLWithString:urlStr];
    NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
        
   [req setHTTPMethod:@"POST"];
   [req setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-type"];
   NSMutableData *postBody = [NSMutableData data];
   [postBody appendData:[[NSString stringWithFormat:@"username=%@", username] 
      dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"&token=%@", 
      pushToken] dataUsingEncoding:NSUTF8StringEncoding]];

   [req setHTTPBody:postBody];
   [[NSURLConnection alloc] initWithRequest:req delegate:nil];
}

Idealmente, você associa o token com algumas informações que identificam o usuário (como nome de usuário da pessoa no seu sistema) de modo que seu servidor saiba a quem enviar a mensagem depois. (É possível pensar nisto como análogo à associação de um número de telefone com um nome de pessoa.) Se não associar tokens com suas próprias informações de identificação de usuário, ainda é possível enviar mensagens a esses dispositivos, mas não é possível customizar a mensagem para cada usuário, porque tudo o que você tem é uma cadeia de caractere de token alfanumérico para o dispositivo de destino.

O servidor deve salvar o token e suas informações de identificação relacionadas em um banco de dados. Na maioria dos aplicativos, é salvo no banco de dados de perfil de usuário.


Enviando uma Mensagem de Push

Para enviar uma mensagem de push, seu servidor:

  1. Procura uma lista de ID do aplicativo para enviar a mensagem
  2. Personaliza a mensagem para cada destinatário baseado nesse perfil do usuário do destinatário
  3. Contata o servidor de sistema de mensagens de APNs

A API de serviços da web para o servidor APNs é complicada. Felizmente, para desenvolvedores Java, a biblioteca JavaPNS aberta facilita muito o trabalho com ela. Consulte Recursos para obter links para o download e documentação de JavaPNS.

O código na Listagem 3 mostra como enviar uma mensagem parecida com SMS para o dispositivo usando a biblioteca JavaPNS:

Listagem 3. Enviando uma Mensagem de Push
String[] devices = {"token1", "token2};
List<PushedNotification> notifications
 = Push.alert("Hello World!", "keypair.p12", "password", false, devices);

Os métodos da interface principal da biblioteca JavaPNS são métodos estáticos no Push de Functional Java. APNs permitem integrar uma variedade de conteúdo em sua mensagem. Consulte o guia de sistema de mensagens de push de iOS para uma completa lista de tipos de carga útil suportada (consulte Recursos). A classe Push fornece métodos de conveniência para cada tipo de mensagem e manipula a conversão da mensagem para o formato JavaScript Object Notation (JSON) aceito pelos servidores APNs. Na Listagem 3, keypair.p12 é o arquivo p12 exportado do KeyChain Access e password é a senha para o arquivo p12. O array devices é uma lista de tokens de dispositivo recebidos do aplicativo iOS. Todos esses dispositivos receberão esta mensagem de push. O valor false no parâmetro designa que a mensagem deve ser enviada ao servidor de desenvolvimento de APNs (o sandbox) em vez de seu servidor de produção. (Lembre-se de que normalmente você cria um par de chaves p12 para o sandbox e um diferente para o servidor de produção.)

O valor de retorno da chamada de método é uma lista de objetos PushedNotification que podem ser usados para apurar o status da entrega de push, como mostrado na Listagem 4:

Listagem 4. Verificando o status da entrega de push
for (PushedNotification notification : notifications) {
    if (notification.isSuccessful()) {
        /* Apple accepted the notification and should deliver it */
    } else {
        String invalidToken = notification.getDevice().getToken();
        /* Add code here to remove invalidToken from your database */
    }
}

Se o objeto de notificação disser que um determinado token do dispositivo não está mais ativo—, por exemplo, se o usuário removeu o aplicativo do dispositivo ou desativou a notificação nas configurações do aplicativo—, é necessário remover o token do banco de dados de modo que não envie mais mensagens para ele.

Outra forma de manter sua lista de tokens do dispositivo ativos atualizada é fazer com que seu aplicativo de servidor faça registro de entrada periodicamente dos servidores APNs. A Listagem 5 mostra como consultar o serviço de feedback de APNs usando JavaPNS para receber uma lista de tokens de dispositivo inválidos do sandbox APNs:

Listagem 5. Efetuando registro de entrada para tokens de dispositivo ativos atualizados
List<Device> inactiveDevices = Push.feedback("keypair.p12", "password", false);
/* remove inactive devices from your own list of devices */

É importante não gastar recursos enviando mensagens a dispositivos que excluíram seu aplicativo ou optaram por receber notificações.


Considerações Adicionais

Notificações de push não podem ser testadas em emuladores iOS. É necessário implementar o aplicativo para um dispositivo real para testá-lo. Como o certificado digital usado para autenticar a mensagem está ligado ao perfil de fornecimento do aplicativo, é necessário testar com o certificado de desenvolvimento quando está no desenvolvimento ou distribuição do aplicativo ad hoc. Você deve alternar para o certificado de produção após o aplicativo ser aprovado e disponibilizado na App Store.

Além disso, é importante entender que a customização e o envio de mensagens de push para um grande banco de dados de usuários são trabalho intensivo de recurso. Por exemplo, é caro recorrer a um banco de dados de um milhão de usuários a cada 5 segundos para identificar os 10 usuários que precisam receber uma mensagem no momento. A infraestrutura do lado do servidor requer design e planejamento cuidadosos para suportar notificações de push frequentes para um número grande de usuários. De forma oposta, enviar uma mensagem de push a um milhão de usuários de uma vez cria muito tráfego que poderia ser mais bem manipulado por meio de um conjunto de encadeamentos, ao contrário do bloqueio de um único encadeamento. A biblioteca JavaPNS fornece uma API fácil que usa conjuntos de encadeamentos para push de mensagens a um grande número de dispositivos simultaneamente.


Conclusão

A tecnologia de push permite que seus aplicativos de servidor ignorem as portadoras de telecomunicações e envie mensagens diretamente a aplicativos de dispositivo iOS pela Internet. Embora a implementação da notificação de push não seja trivial—a necessidade de certificados SSL do lado do cliente para autenticar em relação a servidores Apple é complicada—a ajuda de terceiros como Urban Airship e JavaPNS pode facilitar muito o envio de notificações. SMS e MMS têm seu lugar e ainda são mais confiáveis que a tecnologia de push, mas é possível tornar seus aplicativos iOS mais ricos e mais versáteis ao implementar o sistema de mensagens de push.

Recursos

Aprender

Obter produtos e tecnologias

  • JavaPNS: Faça download do JAR JavaPNS.
  • Avalie produtos IBM da maneira que for melhor para você: faça download da versão de teste de um produto, avalie um produto on-line, use-o em um ambiente de nuvem ou passe algumas horas na SOA Sandbox aprendendo a implementar Arquitetura Orientada a Serviços de modo eficiente.

Discutir

  • Participe da comunidade do My developerWorks. Entre em contato com outros usuários do developerWorks, enquanto explora os blogs, fóruns, grupos e wikis orientados ao desenvolvedor.

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Tecnologia Java
ArticleID=801786
ArticleTitle=Enviando notificações de push a dispositivos iOS
publish-date=03152012