Use as notificações por push

As notificações por push permitem que os provedores de notificação remota enviem notificações para os aplicativos em execução em um dispositivo móvel. O AIR 3.4 tem suporte para notificações por push em dispositivos que usam o Apple Push Notification service (APNs).

Nota: Para ativar as notificações por push em um AIR para aplicativos Android use uma extensão nativa, como as3c2dm , desenvolvida pelo divulgador da Adobe, Piotr Walczyszyn.

O restante desta seção descreve como ativar as notificações por push no AIR para aplicativos iOS.

Nota: Esta discussão assume que você tenha uma ID de desenvolvedor Apple, esteja familiarizado com o fluxo de trabalho de desenvolvimento iOS e tenha implantado pelo menos um aplicativo em um dispositivo iOS.

Visão geral de notificações por push

O Apple Push Notification service (APNs) permite que os provedores de notificação remota enviem notificações para aplicativos em execução em dispositivos iOS. O APNs tem suporte para os seguintes tipos de notificação:

  • Alertas

  • Distintivos

  • Sons

Para obter informações completas sobre o APNs, consulte developer.apple.com .

Usar notificações por push em seu aplicativo envolve vários aspectos:

  • Aplicativo cliente - É registrado para notificações por push, se comunica com o provedor de notificações remotas e recebe notificações por push.

  • iOS - Gerencia a interação entre o aplicativo cliente e o APNs.

  • APNs - Fornece uma tokenID durante o registro do cliente e envia a notificação do provedor de notificação remota para o iOS.

  • Provedor de notificação remota - Armazena as informações de tokenID do aplicativo cliente e envia notificações para o APNs.

Fluxo de trabalho de registro

O fluxo de trabalho para registrar notificações por push em um serviço no lado do servidor é:

  1. O aplicativo cliente solicita que o iOS ative as notificações por push.

  2. O iOS encaminha a solicitação para o ANPs.

  3. O servidor APNs devolve a tokenID para o iOS.

  4. O iOS devolve a tokenID para o aplicativo cliente.

  5. O aplicativo cliente, usando um mecanismo específico do aplicativo, oferece a tokenID para o servidor de notificação remota, que armazena a tokenID para usar para notificações por push.

Fluxo de trabalho de notificações

O fluxo de trabalho de notificações é o seguinte:

  1. O provedor de notificação remota gera uma notificação e transmite a carga da notificação para o APNs junto com a tokenID.

  2. O APNs encaminha a notificação para o iOS no dispositivo.

  3. O iOS encaminha a carga da notificação para o aplicativo.

API de notificação por push

O AIR 3.4 apresenta um conjunto de APIs que tem suporte para notificações por push no iOS. Essas APIs estão no pacote flash.notifications e incluem as seguintes classes:

  • NotificationStyle - Define as constantes por tipos de notificação: ALERTA , MEDALHA e SOM .C

  • RemoteNotifier - Permite que você assine e deixe de assinar notificações por push.

  • RemoteNotifierSubscribeOptions - Permite que você selecione quais tipos de notificação quer receber. Use a propriedade notificationStyles para definir um vetor de sequências de caracteres que registram vários tipos de notificação.

O AIR 3.4 também inclui flash.events.RemoteNotificationEvent que são enviados pelo RemoteNotifier , de acordo com o seguinte:

  • Quando a assinatura de um aplicativo é concluída com sucesso e uma nova tokenID é recebida do APNs.

  • Após receber uma nova notificação remota.

Além disso, o RemoteNotifier envia flash.events.StatusEvent caso encontre algum erro durante o processo de assinatura.

Gerenciar as notificações por push no aplicativo.

Para registrar seu aplicativo para notificações por push, você deve realizar uma das seguintes etapas:

  • Criar um código que assine notificações por push em seu aplicativo.

  • Ativar as notificações por push no XML do aplicativo.

  • Criar um certificado e um perfil de provisionamento para ativar o iOS Push Services.

O exemplo de código anotado a seguir assina notificações por push e manipula eventos de notificação por push:

package 
                        { 
                        import flash.display.Sprite; 
                        import flash.display.StageAlign; 
                        import flash.display.StageScaleMode; 
                        import flash.events.*; 
                        import flash.events.Event; 
                        import flash.events.IOErrorEvent; 
                        import flash.events.MouseEvent; 
                        import flash.net.*; 
                        import flash.text.TextField; 
                        import flash.text.TextFormat; 
                        import flash.ui.Multitouch; 
                        import flash.ui.MultitouchInputMode; 
                        // Required packages for push notifications 
                        import flash.notifications.NotificationStyle; 
                        import flash.notifications.RemoteNotifier; 
                        import flash.notifications.RemoteNotifierSubscribeOptions; 
                        import flash.events.RemoteNotificationEvent; 
                        import flash.events.StatusEvent; 
                        [SWF(width="1280", height="752", frameRate="60")] 

                        public class TestPushNotifications extends Sprite 
                        { 
                        private var notiStyles:Vector.<String> = new Vector.<String>;; 
                        private var tt:TextField = new TextField(); 
                        private var tf:TextFormat = new TextFormat(); 
                        // Contains the notification styles that your app wants to receive 
                        private var preferredStyles:Vector.<String> = new Vector.<String>(); 
                        private var subscribeOptions:RemoteNotifierSubscribeOptions = new RemoteNotifierSubscribeOptions(); 
                        private var remoteNot:RemoteNotifier = new RemoteNotifier(); 

                        private var subsButton:CustomButton = new CustomButton("Subscribe"); 
                        private var unSubsButton:CustomButton = new CustomButton("UnSubscribe"); 
                        private var clearButton:CustomButton = new CustomButton("clearText"); 

                        private var urlreq:URLRequest; 
                        private var urlLoad:URLLoader = new URLLoader(); 
                        private var urlString:String; 

                        public function TestPushNotifications() 
                        { 
                        super(); 

                        Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT; 
                        stage.align = StageAlign.TOP_LEFT; 
                        stage.scaleMode = StageScaleMode.NO_SCALE; 

                        tf.size = 20; 
                        tf.bold = true; 


                        tt.x=0; 
                        tt.y =150; 
                        tt.height = stage.stageHeight; 
                        tt.width = stage.stageWidth; 
                        tt.border = true; 
                        tt.defaultTextFormat = tf; 

                        addChild(tt); 

                        subsButton.x = 150; 
                        subsButton.y=10; 
                        subsButton.addEventListener(MouseEvent.CLICK,subsButtonHandler); 
                        stage.addChild(subsButton); 

                        unSubsButton.x = 300; 
                        unSubsButton.y=10; 
                        unSubsButton.addEventListener(MouseEvent.CLICK,unSubsButtonHandler); 
                        stage.addChild(unSubsButton); 

                        clearButton.x = 450; 
                        clearButton.y=10; 
                        clearButton.addEventListener(MouseEvent.CLICK,clearButtonHandler); 
                        stage.addChild(clearButton); 

                        // 
                        tt.text += "\n SupportedNotification Styles: " + RemoteNotifier.supportedNotificationStyles.toString() + "\n"; 

                        tt.text += "\n Before Preferred notificationStyles: " + subscribeOptions.notificationStyles.toString() + "\n"; 

                        // Subscribe to all three styles of push notifications: 
                        // ALERT, BADGE, and SOUND. 
                        preferredStyles.push(NotificationStyle.ALERT ,NotificationStyle.BADGE,NotificationStyle.SOUND ); 

                        subscribeOptions.notificationStyles= preferredStyles; 

                        tt.text += "\n After Preferred notificationStyles:" + subscribeOptions.notificationStyles.toString() + "\n"; 


                        remoteNot.addEventListener(RemoteNotificationEvent.TOKEN,tokenHandler); 
                        remoteNot.addEventListener(RemoteNotificationEvent.NOTIFICATION,notificationHandler); 
                        remoteNot.addEventListener(StatusEvent.STATUS,statusHandler); 

                        this.stage.addEventListener(Event.ACTIVATE,activateHandler); 


                        } 
                        // Apple recommends that each time an app activates, it subscribe for 
                        // push notifications. 
                        public function activateHandler(e:Event):void{ 
                        // Before subscribing to push notifications, ensure the device supports it. 
                        // supportedNotificationStyles returns the types of notifications 
                        // that the OS platform supports 
                        if(RemoteNotifier.supportedNotificationStyles.toString() != "") 
                        {     
                        remoteNot.subscribe(subscribeOptions); 
                        } 
                        else{ 
                        tt.appendText("\n Remote Notifications not supported on this Platform !"); 
                        } 
                        } 
                        public function subsButtonHandler(e:MouseEvent):void{ 
                        remoteNot.subscribe(subscribeOptions); 
                        } 
                        // Optionally unsubscribe from push notfications at runtime. 
                        public function unSubsButtonHandler(e:MouseEvent):void{ 
                        remoteNot.unsubscribe(); 
                        tt.text +="\n UNSUBSCRIBED"; 
                        } 

                        public function clearButtonHandler(e:MouseEvent):void{ 
                        tt.text = " "; 
                        } 
                        // Receive notification payload data and use it in your app 
                        public function notificationHandler(e:RemoteNotificationEvent):void{ 
                        tt.appendText("\nRemoteNotificationEvent type: " + e.type + 
                        "\nbubbles: "+ e.bubbles + "\ncancelable " +e.cancelable); 

                        for (var x:String in e.data) { 
                        tt.text += "\n"+ x + ":  " + e.data[x]; 
                        } 
                        } 
                        // If the subscribe() request succeeds, a RemoteNotificationEvent of 
                        // type TOKEN is received, from which you retrieve e.tokenId, 
                        // which you use to register with the server provider (urbanairship, in 
                        // this example. 
                        public function tokenHandler(e:RemoteNotificationEvent):void 
                        { 
                        tt.appendText("\nRemoteNotificationEvent type: "+e.type +"\nBubbles: "+ e.bubbles + "\ncancelable " +e.cancelable +"\ntokenID:\n"+ e.tokenId +"\n"); 

                        urlString = new String("https://go.urbanairship.com/api/device_tokens/" + 
                        e.tokenId); 
                        urlreq = new URLRequest(urlString); 

                        urlreq.authenticate = true; 
                        urlreq.method = URLRequestMethod.PUT; 

                        URLRequestDefaults.setLoginCredentialsForHost 
                        ("go.urbanairship.com", 
                        "1ssB2iV_RL6_UBLiYMQVfg","t-kZlzXGQ6-yU8T3iHiSyQ"); 

                        urlLoad.load(urlreq); 
                        urlLoad.addEventListener(IOErrorEvent.IO_ERROR,iohandler); 
                        urlLoad.addEventListener(Event.COMPLETE,compHandler); 
                        urlLoad.addEventListener(HTTPStatusEvent.HTTP_STATUS,httpHandler); 

                        } 

                        private function iohandler(e:IOErrorEvent):void 
                        { 
                        tt.appendText("\n In IOError handler" + e.errorID +" " +e.type); 

                        } 
                        private function compHandler(e:Event):void{ 
                        tt.appendText("\n In Complete handler,"+"status: " +e.type + "\n"); 
                        } 

                        private function httpHandler(e:HTTPStatusEvent):void{ 
                        tt.appendText("\n in httpstatus handler,"+ "Status: " + e.status); 
                        } 

                        // If the subscription request fails, StatusEvent is dispatched with 
                        // error level and code. 
                        public function statusHandler(e:StatusEvent):void{ 
                        tt.appendText("\n statusHandler"); 
                        tt.appendText("event Level" + e.level +"\nevent code " + 
                        e.code + "\ne.currentTarget: " + e.currentTarget.toString()); 
                        } 
                        } 
                        }

Ativar notificações por push no arquivo XML do aplicativo.

Para utilizar notificações por push em seu aplicativo, forneça o seguinte na tag Entitlements , na tag iphone :

<iphone> 
                            ... 
                               <Entitlements> 
                                  <![CDATA[ 
                                     <key>aps-environment</key> 
                                     <string>development</string> 
                                  ]]> 
                               </Entitlements> 
                            </iphone>

Quando estiver pronto para enviar o aplicativo para a App Store, um elemento <string> para desenvolvimento para produção:

      <string>production</string>

Se seu aplicativo suporta sequências de caracteres localizadas, especifique os idiomas na tag supportedLanguages embaixo da tag initialWindow conforme o exemplo a seguir:

<supportedLanguages>en de cs es fr it ja ko nl pl pt</supportedLanguages>

Criar um certificado e um perfil de provisionamento para ativar o iOS Push Services

Para ativar a comunicação entre aplicativos e o APNs, você deve empacotar o aplicativo com um certificado e um perfil de provisionamento que ativem os iOS Push Services, conforme a seguir:

  1. Faça o login em sua conta de desenvolvedor Apple.

  2. Navegue até o Provisioning Portal (Portal de provisionamento).

  3. Clique na aba de App IDs (IDs do aplicativo).

  4. Clique no botão New App ID (Nova ID do aplicativo).

  5. Especifique uma descrição e um identificador de pacote, você não deve usar * no identificador de pacote.

  6. Clique em Submit (Enviar). O Portal de provisionamento gera sua ID do aplicativo e exibe novamente a página das ID dos aplicativos.

  7. Clique em Configure (Configurar), à direita de sua ID do aplicativo. A página Configure App ID (Configurar ID do aplicativo) é exibida.

  8. Marque a caixa de seleção Enable for Apple Push Notification service (Habilitar para Apple Push Notification service). Observe que existem dois tipos de certificados SSL por push: um para desenvolvimento/teste e outro para produção.

  9. Clique no botão Configurar, à direita do Certificado do desenvolvimento por push SSL. A página Gerar solicitação de assinatura de certificado (CSR) é exibida.

  10. Gere uma CSR utilizando um utilitário Acesso Porta-chaves conforme as instruções da página.

  11. Gerar o certificado SSL.

  12. Faça o download e instale o certificado SSL.

  13. Opcional: repita os passos 9 a 12 para produzir o Certificado por SSL por push.

  14. Clique em Concluído. A página Configure App ID (Configurar ID do aplicativo) é exibida.

  15. Clique em Concluído. A página de ID do aplicativo é exibida. Observe o círculo verde ao lado da Notificação push de sua ID do aplicativo.

  16. Certifique-se de salvar seus certificados SSL, eles serão usados posteriormente para comunicação entre o aplicativo e o provedor.

  17. Clique na aba Provisionamento para exibir a página Perfis de provisionamento.

  18. Crie um perfil de provisionamento para a nova ID do aplicativo e faça o download deste perfil.

  19. Clique na aba Certificados e faça o download do novo certificado para o novo perfil de provisionamento.

Use avisos sonoros para notificações por push.

Para ativar as notificações sonoras para seu aplicativo, agrupe os arquivos de áudio da mesma forma como faria com qualquer outro ativo, mas no mesmo diretório, como os arquivos SWF e app-xml. Por exemplo:

Build/adt -package -target ipa-app-store -provisioning-profile _-_.mobileprovision -storetype pkcs12 -keystore _-_.p12 test.ipa test-app.xml test.swf sound.caf sound1.caf

A Apple suporta os seguinte formatos de arquivos de áudio (arquivos aiff, wav ou caf):

  • PCM Linear

  • MA4 (IMA/ADPCM)

  • uLaw

  • aLaw

Utilize notificações de alerta localizadas

Para usar notificações de alerta localizadas em seu aplicativo agrupe as sequências de caracteres localizadas no formulário da pasta lproj. Por exemplo, você suporta alertas em espanhol:

  1. Crie uma pasta es.lproj no projeto no mesmo nível que o arquivo app-xml.

  2. Na pasta es.lproj crie um arquivo de texto chamado LocalizableStrings.

  3. Abra o Localizable.Strings em um editor de texto e adicione chaves de mensagem e as strings localizadas correspondentes. Por exemplo:

    "PokeMessageFormat" = "La notificación de alertas en español."
  4. Salve o arquivo.

  5. Quando o aplicativo receber um alerta de notificação com esta chave e o idioma do dispositivo estiver em espanhol o texto traduzido do alerta será exibido.

Configure um provedor de notificação remota.

Você precisa de um provedor de notificações remotas para enviar notificações por push para seu aplicativo. Este servidor de aplicativo age como um provedor, aceitando sua entrada por push e enviando a notificação e os dados de notificação para o APNs, que, por sua vez, envia a notificação por push para um aplicativo cliente.

Para obter mais informações sobre notificações por push de um provedor de notificações remotas, consulte Provedor de comunicação com o Apple Push Notification Service na biblioteca do desenvolvedor da Apple.

Opções de provedor de notificação por push remoto

As opções para provedor de notificação remota incluem:

  • Criar seu próprio provedor baseado em um servidor APNS-php de código aberto. Você pode montar um servidor PHP usando http://code.google.com/p/apns-php/ . Este projeto de Código do Google permite que você projete uma interface que combine com suas necessidades específicas.

  • Use um provedor de serviços. Por exemplo, o http://urbanairship.com/ oferece um provedor APNs pronto para uso. Após se registrar neste serviço você começa a fornecer o token de seu dispositivo usando um código similar ao a seguir:

    private var urlreq:URLRequest; 
                                        private var urlLoad:URLLoader = new URLLoader(); 
                                        private var urlString:String; 
    
                                        //When subscription is successful then only call the following code 
                                        urlString = new String("https://go.urbanairship.com/api/device_tokens/" + e.tokenId); 
                                        urlreq = new URLRequest(urlString); 
    
                                        urlreq.authenticate = true; 
                                        urlreq.method = URLRequestMethod.PUT; 
                                        URLRequestDefaults.setLoginCredentialsForHost("go.urbanairship.com", 
                                           "Application Key","Application Secret"); 
                                        urlLoad.load(urlreq); 
                                        urlLoad.addEventListener(IOErrorEvent.IO_ERROR,iohandler); 
                                        urlLoad.addEventListener(Event.COMPLETE,compHandler); 
                                        urlLoad.addEventListener(HTTPStatusEvent.HTTP_STATUS,httpHandler); 
    
                                        private function iohandler(e:IOErrorEvent):void{ 
                                           trace("\n In IOError handler" + e.errorID +" " +e.type); 
                                        } 
    
                                        private function compHandler(e:Event):void{ 
                                           trace("\n In Complete handler,"+"status: " +e.type + "\n"); 
                                        } 
    
                                        private function httpHandler(e:HTTPStatusEvent):void{ 
                                           tt.appendText("\n in httpstatus handler,"+ "Status: " + e.status); 
                                        }

    Você pode então enviar notificações de teste utilizando as ferramentas Urban Airship.

Certificados para provedor de notificação remota.

Você deve copiar o certificado SSL e a chave privada, gerada anteriormente, no local apropriado no servidor do provedor de notificação remota. Normalmente você combina estes dois arquivos em um único arquivo .pem . Para isso, execute as etapas a seguir:

  1. Abra uma janela de terminal.

  2. Crie um arquivo .pem com base no certificado SSL digitando o comando:

    openssl x509 -in aps_developer_identity.cer -inform der -out TestPushDev.pem
  3. Crie um arquivo .pem da chave privada ( .p12 ) digitando o comando:

    openssl pkcs12 -nocerts -out TestPushPrivateKey.pem -in certificates.p12
  4. Combine os dois arquivos .pem em um único arquivo digitando o comando:

    cat TestPushDev.pem TestPushPrivateKey.pem > FinalTestPush.pem
  5. Forneça o arquivo .pem combinado ao provedor do servidor quando criar seu aplicativo por push no lado do servidor.

Para obter mais informações consulte Instalando o certificado SSL e a chave no servidor no Guia de programação de notificação por push e local da Apple.

Manipular as notificações por push em um aplicativo

A manipulação de notificações por push em um aplicativo envolve:

  • Configuração global do usuário e aceitação de notificações por push

  • A aprovação do usuário de notificações por push individuais

  • Manipulação de notificações por push e cargas de dados de notificação

Configuração e aprovação de configurações por push

Na primeira vez que um usuário abre um aplicativo com notificações por push ativada, o iOS exibe um diálogo appname Gostaria de lhe enviar notificações por push com os botões Não permitir e OK. Se o usuário selecionar OK o aplicativo poderá receber todos os tipos de notificações para os quais foi assinado. Se o usuário selecionar Não permitir, não receberá notificações.

Nota: O usuário também pode ir até Configurações > Notificações para controlar tipos específicos de notificação que pode receber de cada aplicativo ativado para push.

A Apple recomenda que sempre que um aplicativo estiver ativado, ele deve assinar notificações por push. Quando um aplicativo chama RemoteNotifier.subscriber() recebe um RemoteNotificationEvent de tipo token , que contém uma tokenId numérica de 32 bytes exclusiva que identifica especificamente o aplicativo no dispositivo.

Quando o dispositivo recebe uma notificação por push um pop-up é exibido com os botões de Fechar e Abrir. Se o usuário tocar em Fechar, nada acontece. Se tocar em Abrir o iOS executa o aplicativo e ele recebe uma flash.events.RemoteNotificationEvent do tipo notification conforme descrito abaixo.

A manipulação de notificações por push e dados de carga.

Quando um provedor de notificação remota envia uma notificação para um dispositivo usando uma tokenID seu aplicativo recebe um flash.events.RemoteNotificationEvent do tipo notification independentemente de estar em execução. Neste momento seu aplicativo realiza um processamento específico de notificação. Se seu aplicativo manipula os dados de notificação, você acessa os dados pela propriedade formatada para JSON RemoteNotificationEvent.data .