Buenas Tardes, la semana pasada ya dimos las primeras pinceladas de las notificaciones push para IOS. En esta ocasión vamos a completarlas. Siguiendo este blog podrás generar notificaciones push para tu aplicación, incluyendo la parte del servidor que se programará en PHP utilizando la potencialidad que nos ofrece el componente de desarrollo symfony2.
Como ya sabrás apple no permite realizar demasiadas tareas en segundo plano, para evitar consumos excesivos de batería. Por lo que si una aplicación desea notificar algo en un momento determinado, ¿cómo lo hace?.
Utiliza las notificaciones push:
- Se entregan inmediatamente. Si no se pueden entregar se almacenan por un tiempo limitado
- Se gestionan mediante un servidor
¿Qué se necesita para poder enviar notificaciones?:
- Un dispositivo real. No se pueden recibir desde un simulador.
- Ser miembro del programa de desarrollo de Apple (developer.apple.com). Es necesario generar un «Provisioning Profiles», además de un certificado SSL que se instalará en el servidor
- Un servidor para el envío. Se programará en PHP.
Funcionamiento:
- Cuando la aplicación se ejecuta pregunta al usuario si desea recibir notificaciones PUSH. Si el usuario lo acepta, el sistema solicita al APNS (Apple Push Notificacion Service).
- El servidor apple genera el device token y se lo envía a la aplicación
- La aplicación envía a nuestro servidor propio el device token. El servidor lo almacenará para poder generar las notificaciones.
- El servidor genera la notificación y se la envía al APNS. En nuestro caso, las notificaciones se generaran con un formulario simple en una web.
- El APNS envía la notificación a la aplicación.
¿Cómo crear una notificación push?
Nuestro servidor es el encargado de generar el mensaje en la notificación. Ha de tener las siguientes características:
- Es un mensaje corto que contiene el «device token», mensaje y algunos bytes más
- Ha de tener formato JSON
- 256 bytes como máximo
- Los claves fuera de «aps» no se utilizan, pero pueden ser interesantes para tu aplicación
Un ejemplo de mensaje es:
En este post podrás leer
{
«aps»: {
«alert» : «Mensaje de prueba»,
«badge» : 125
},
«key-adicional» : 1
}
Puesto que es tamaño es limitado, es conveniente no incluir espacios ni tabulaciones innecesarios en el mensaje.
{«aps»: {«alert» : «Mensaje de prueba»,»badge» : 125},»key-adicional» : 1}
Provisioning Profiles y Generación de Certificados:
Como comentamos antes para poder utilizar las notificaciones push es necesario generar un certificado para firmar la aplicación y de esta forma poder instalarla en un dispositivo real. Además, para poder crear la notificaciones se necesita un certificado SSL que se instalará en nuestro servidor.
Apple tiene 2 tipos de certificados:
Producción: Es el certificado que se utiliza cuando vamos a distribuir una aplicación en al Apple Store.
Desarrollo: Son los certificados que se utilizan para la depuración de aplicaciones. En nuestro caso, vamos a utilizar este. El servidor ha de contener el certificado SSL relacionado con este.
Obtención del certificado CSR(Certificate Signing Request)
Para poder generar el Provisioning Profile es necesario crear antes un certificado digital basado en clave pública y clave privada. Para ello, vamos a «Acceso a llaveros» -> «Asistente para certificados» -> «Solicitar un certificado de una autoridad de certificación»
Se fija el nombre que se le quiere dar al certificado. Tambien se marca la opción de que se guarde en disco, para almacenarlo en nuestro ordenador. Y damos a continuar. Por ultimo se selecciona el nombre que se le quiere dar al certificado en mi caso «NotificacionesPUSH.certSigningRequest»
La clave privada ya se ha almacenado en el «Acceso a llaveros». Ya se puede exporta para generar el «Provioning Profile»
Se almacena con el nombre «NotificacionPUSH.p12»
Por último se fija la clave de acceso al certificado
Creamos el App ID y el certificado SSL para el servidor
Nos identificamos en «developer apple», vamos a la parte de «Certificados, identificadores y Profile» y entramos en «Identificadores»
Ahora vamos a crear un nuevo «App ID», para ello pulsamos en botón +
A continuación hemos de introducir los siguientes datos:
- App Id description: Nombre de la aplicación
- Explicit App ID: Identificador de la aplicación. En xcode lo podemos consultar como «Bundle Identifier». En las características generales del proyecto
- App Services: Seleccionamos notificaciones push
Y pulsamos continuar.
A continuación, nos pide que confirmemos la información
Nos debe de aparecer el nuevo «App ID» en el listado.
Pulsamos sobre el «App ID» notificacionesPUSH y nos aparece algo similar a la siguiente imagen.
Podemos ver que en la parte de notificaciones push dos circulos de color naranja, que significa que has de configurarlas. Para nuestro ejemplo, solo se va a configurar la sección de «Developement». Pulsamos «Edit»
Creamos el certificado SSL en la parte de «Developement» que se instalará en nuestro servidor para realizar las pruebas de la aplicación.
Se sube el certificado que se ha generado en nuestro ordenador.
Para finalizar nos decargamos el certificado SSL que genera apple para instarlo posteriormente en nuestro servidor.
El certificado de desarrollo solo es válido durante 3 meses.
Generamos el archivo .PEM
Es el archivo que se utilizará en el servidor. Para generarlo necesitamos:
- Certificado SSL (aps_development.cer)
Una vez descargado el archivo, hacemos doble click sobre él y se nos abrirá el «Acceso a llaveros». En la parte de certificados se nos ha instalado el nuevo certificado. Pulsamos sobre la flecha y lo abrimos y exportamos el certificado a un archivo .p12 que será el que se utilizará para el generar el .pem y subirlo al servidor.
El certificado y la clave primaria se convierten para que sea más fácil de utilizar en PHP. Se convierte con la siguiente orden:
openssl pkcs12 -in notificacionesPUSH.p12 -out notificacionesPUSH.pem -nodes -clcerts
Enter Import Password:
MAC verified OK
Generacion del «Provisioning Profile»
Vamos a la parte de «Provisioning Profile» y pulsamos sobre el boton + para crear uno nuevo
Se selecciona el tipo de «Profile»
Seleccionamos el «App ID» generado anteriormente
Seleccionamos el certificado
A continuación los dispositivos
Se le da un nombre a la aplicación
Nos descargamos el «Profile»
Creamos una aplicación simple:
Vamos a xCode y creamos un nuevo proyecto con la plantilla «Single View Application». Hemos de ponerle el mismo nombre que el identificador que se utilizó para generar los certificados. Si no lo hiciesemos, la aplicación no funcionaría.
Lo primero que hemos de hacer es indicar al servidor de apple que esta aplicación desea recibir notificaciones push. Para ello, vamos a appDelegate.m y modificamos la función (BOOL) application: didFinishLaunchingWithOptions: con el siguiente código:
[[UIApplicationsharedApplication] registerForRemoteNotificationTypes🙁UIRemoteNotificationTypeAlert| UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
Si ejecutamos la aplicación nos ha de preguntar si deseamos recibir notificaciones:
Hemos de implementar el método que recibe el token del servidor:
#pragma mark Push Notifications Methods
– (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:
(NSData *)deviceToken {
NSLog(@»Mi device token es %@», deviceToken);
}
Una vez tenemos el token podemos registrarlo en el servidor con una petición POST como se indica en este post
Tambien has de implementar la función que recibe los errores por si se produce alguna.
– (void)application:(UIApplication *)application
didFailToRegisterForRemoteNotificationsWithError:
(NSError *)error{
NSLog(@»Error al obtener el token. Error: %@», error);
}
Implementación del servidor con Symfony2:
El proyecto va a ser muy simple. Se genera un nuevo proyecto con Netbeans, por ejemplo. Se crea el controlador principal que va a enviar las notificacionesPUSH. Que contendrá el siguiente código:
public function inicioAction(){
// Se pone el token sin espacion
$deviceToken = ‘DEVICETOKEN‘;
// Se fija la contraseña del certificado
$passphrase = ‘CONTRASEÑA’;
// Mensaje a enviar
$message = ‘Mi primera notificacion!’;
$ctx = stream_context_create();
// Se obtiene el certificado
stream_context_set_option($ctx, ‘ssl’, ‘local_cert’,
‘certificado/NotificacionesPUSH.pem’);
stream_context_set_option($ctx, ‘ssl’, ‘passphrase’, $passphrase);
// Se conecta cone l servidor
$fp = stream_socket_client(‘ssl://gateway.sandbox.push.apple.com:2195’,
$err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT,
$ctx);
if (!$fp)
exit(«Failed to connect: $err $errstr» . PHP_EOL);
echo ‘Connected to APNS’ . PHP_EOL;
// Se crea el payload
$body[‘aps’] = array(
‘alert’ => $message,
‘sound’ => ‘default’
);
// Codificación a JSON
$payload = json_encode($body);
// Se crea la notificación
$msg = chr(0) . pack(‘n’, 32) . pack(‘H*’, $deviceToken) . pack(‘n’, strlen($payload)) . $payload;
// Se envía al servidor
$result = fwrite($fp, $msg, strlen($msg));
if (!$result)
echo ‘Message not delivered’ . PHP_EOL;
else
echo ‘Message successfully delivered’ . PHP_EOL;
fclose($fp);
return $this->render(‘notificacionesBundle:Principal:inicio.html.twig’);
}
Ejecución del servidor:
Si ejecutamos el servidor en varias ocasiones, vemos que se van recibiendo las notificaciones en nuestro dispositivo. Cuando pulsamos sobre alguna se nos abrirá la aplicación.
0 comentarios