Red de conocimiento informático - Conocimiento del nombre de dominio - Cómo escribir un servidor de notificaciones push de Apple

Cómo escribir un servidor de notificaciones push de Apple

Estructura básica:

Conéctese a APNS usando una licencia SSL única

Recorra los mensajes que necesita enviar

para cada mensaje Construyendo la carga útil

Desconexión de APNS

El proceso de datos de notificación remota es unidireccional. El proveedor empaqueta los datos, incluido el token del dispositivo cliente y la carga útil, y los envía a APNS, que luego envía la notificación al dispositivo final.

Limitaciones:

La carga útil está limitada a 256 bytes; incluye el cuerpo del mensaje y otros atributos que desea transmitir. Las notificaciones push no son adecuadas para transmitir grandes cantidades de datos. Por ejemplo, solo enviamos un mensaje corto para notificar al servidor que se ha activado el evento monitoreado.

APNS no proporciona comentarios sobre el estado de si el mensaje se envió correctamente o no. Una razón es que si no se puede acceder a un dispositivo, los mensajes que se le envíen se pondrán en cola; sin embargo, solo se pondrá en cola el mensaje enviado más recientemente, sobrescribiendo los mensajes enviados anteriormente pero que no tuvieron éxito.

Las notificaciones push no son adecuadas para enviar notificaciones de emergencia ya que los mensajes solo se pueden enviar si el dispositivo tiene conexión wifi o servicio celular, por lo que recomendamos utilizarlas junto con otros métodos como correo electrónico o SMS. razón.

La licencia SSL utilizada para comunicarse con APNS (que se analiza a continuación) se genera a nivel de programa. El método de implementación cubierto en este tutorial solo funciona para una única aplicación de iPhone, por lo que si tiene varias aplicaciones, deberá modificar el código para que sea adecuado para el uso de varias licencias.

Token de dispositivo:

Cada mensaje push debe estar dirigido a un dispositivo específico. Esto se logra mediante el uso de un deviceToken (token de dispositivo) único generado por APNS en su aplicación de iPhone. Una vez que obtenga este token, deberá almacenarlo en el servidor en lugar de hacerlo en la aplicación de su iPhone. Se ve así:

c9d4c07c fbbc26d6 ef87a44d 53e16983 1096a5d5 fd825475 56659ddd f715defc

En nuestro programa Server Density iPhone, llamamos al método de generación de token correspondiente cuando se inicia el programa y luego se pasa. de regreso a nuestro servidor a través de una llamada API HTTP. Esto hará que el deviceToken se almacene en la base de datos del servidor sobre el usuario para que podamos usarlo para comunicarnos con el usuario que posee este dispositivo.

Servicio de comentarios:

Apple también proporciona un Servicio de comentarios que debes consultar periódicamente. Proporciona una lista de tokens de dispositivos que se utilizaron anteriormente pero que ya no son válidos (por ejemplo, el usuario desinstaló el programa de su iPhone). Puede eliminar estos tokens de dispositivo de su base de datos.

Licencia:

Lo primero que debe hacer para iniciar un servicio push es obtener una licencia push. Se utiliza para identificarlo cuando se comunica con APNS a través de SSL.

Genere una licencia SSL de notificación push de Apple en Mac:

Inicie sesión en el Portal de conexión para desarrolladores de iPhone y haga clic en ID de aplicación

Cree un ID de aplicación sin utilizar comodines . Los ID comodín no se pueden utilizar con los servicios de notificaciones push. Por ejemplo, nuestro ID de aplicación para iPhone se ve así: ?AB123346CD.com.serverdensity.iphone

Haga clic en "Configurar" junto al ID de la aplicación y luego presione el botón Producir licencia de notificación push. Siga los pasos guiados por el "Asistente" para generar una firma y cargarla, y finalmente descargar la licencia generada. Este paso también se trata en la documentación de Apple.

Introduce tu aps_developer_identity.cer en Keychain haciendo doble clic en el archivo .cer.

Inicie el Asistente de Llavero en su Mac y luego seleccione la categoría Certificados en el llavero de inicio de sesión. Verá una opción expandible "Servicios push de desarrollo de Apple"

Amplíe esta opción y haga clic derecho en "Servicios push de desarrollo de Apple" > Exportar "Servicios push de desarrollo de Apple ID123". Guárdelo como archivo apns-dev-cert.p12.

Extienda "Servicios push de desarrollo de Apple" y haga lo mismo con la "Clave privada" y guárdela como archivo apns-dev-key.p12.

Estos archivos deben convertirse al formato PEM mediante el comando de terminal: openssl?pkcs12?-clcerts?-nokeys?-out?apns-dev-cert.pem?-in?apns-dev-cert .p12

openssl?pkcs12?-nocerts?-out?apns-dev-key.pem?-in?apns-dev-key.p12

Si desea eliminar el contraseña. No establezca ni ejecute al exportar/convertir: openssl?rsa?-in?apns-dev-key.pem?-out?apns-dev-key-noenc.pem

Finalmente, necesita combinar los archivos de clave y licencia en el archivo apns-dev.pem, que se requiere al conectarse a APNS: cat?apns-dev-cert.pem?apns-dev-key-noenc.pem?>?apns-dev . pem

Guarde este archivo con un nombre fácil de recordar que pueda necesitar más adelante. Los pasos anteriores también se aplican a la generación de licencias de productos.

Contenido de la carga útil:

La carga útil está formateada en formato JSON siguiendo el estándar RFC 4627. Consta de los siguientes componentes:

Sugerencia: una cadena de texto que se muestra en el dispositivo

Identificación: un número entero que se muestra encima del icono del programa en la pantalla del dispositivo

Sonido – ?Muestra el nombre textual del sonido que suena cuando se emite el mensaje en el dispositivo

Este tutorial solo trata sobre el envío de una cadena de texto de aviso simple, pero también es posible enviar un diccionario configurado con varias opciones como mostrar un botón personalizado, etc.

Crear una carga útil:

Usando PHP es fácil crear una carga útil a partir de una matriz y convertirla a JSON: $payload['aps']?=?array('alert '?=>? '¿Este?es?el?texto?de?alerta',?'badge'?=>?1,?'sound'?=>?'default');

$carga útil? =?json_encode($ payload);

Muestra el contenido de $payload para ver la cadena JSON enviada a APNS: { "aps"?:?{?"alert"?:?"This?is? the?alert? text",?"badge"?:?1,?"sound"?:?"default"?}

}

Esto hará que el mensaje sea que se muestra en el dispositivo, lo que activa el sonido de promoción y coloca un "1" en el ícono del programa. Los botones predeterminados "Cerrar" y "Ver" se muestran en la ventana emergente.

Para el programa Server Density iPhone, es importante que el usuario presione "Ver" para ingresar directamente al servidor que generó este mensaje, por lo que agregamos un valor personalizado adicional: $payload['aps' ] ?=?array('alerta'?=>?'¿Este?es?el?texto?alerta',?'badge'?=>?1,?'sonido'?=>?'default');

$payload['server']?=?array('serverId'?=>?$serverId,?'name'?=>?$name);

$salida?= ? json_encode($payload);

Cuando el usuario presiona "Ver", el valor del servidor personalizado se pasará al programa en el dispositivo. Los valores JSON son los siguientes: { "aps"?:?{?"alert"?:?"This?is?the?alert?text",?"badge"?:?1,?"sound"? :?"default" ?}, "servidor"?:?{?"serverId"?:?1,?"nombre"?:?"Servidor?nombre")

}

256 bytes El límite se aplica a toda la carga útil, incluidos los conjuntos de diccionarios personalizados.

Interfaz nativa

En Server Density, una vez que se genera un mensaje, se creará una carga útil y se insertará en la cola. Por lo tanto podemos enviar múltiples cargas útiles al mismo tiempo si es necesario.

Apple recomienda este método porque si te conectas y desconectas con frecuencia al enviar cada carga útil, APNS puede bloquear tu IP.

Como lo describe Apple:

La interfaz nativa utiliza sockets nativos, tiene contenido binario, utiliza tecnología de flujo de datos y no genera comentarios.

Abrir la conexión

El código PHP 5 para abrir la conexión es el siguiente: $apnsHost?=?'gateway.sandbox.push.apple.com';

$ apnsPort?=?2195;

$apnsCert?=?'apns-dev.pem';

$streamContext?=?stream_context_create();

stream_context_set_option ($streamContext,?'ssl',?'local_cert',?$apnsCert);

$apns?=?stream_socket_client('ssl://'?.?$apnsHost?. ?':' ?.?$apnsPort,?$error,?$errorString,?2,

STREAM_CLIENT_CONNECT,?$streamContext);

Si se envía un error, puede consulte $errorString. También incluye detalles si la licencia SSL es incorrecta.

El archivo de licencia se encuentra en el directorio de trabajo actual del código PHP ejecutado. Puede especificar su ruta absoluta si es necesario.

Tenga en cuenta que se debe utilizar una licencia de desarrollo y una zona de pruebas durante las pruebas. El nombre de host disponible es gateway.push.apple.com y debe utilizar una licencia de producto diferente.

Envío de carga útil

Aquí, recorremos toda la cola de carga útil para enviarla.

Un ejemplo sencillo de creación de contenido binario enviado a APNS es el siguiente: $apnsMessage?=?chr(0)?.?chr(0)?.?chr(32)?.?pack('H*',?str_replace( '?' ,?'',?$deviceToken))?.?chr(0)?.

chr(strlen($payload))?.?$payload;

fwrite($ apns,?$apnsMessage)

Tenga en cuenta que $deviceToken se extrae de la base de datos y elimina espacios. También debemos comprobar si $payload supera los 256 bytes.

$apnsMessage incluye la carga útil binaria correcta y fwrite escribe la carga útil en la conexión de flujo de datos actualmente activa.

Una vez completada, la conexión debe cerrarse: socket_close($apns);

fclose($apns

php-apns

<); p> Existe una biblioteca de servidor de código abierto php-apns que implementa todas las funciones anteriores y se basa en memcached. No queríamos utilizar ningún código de terceros, por lo que escribimos nuestro propio servidor por completo. Usamos un sistema cron personalizado que se ejecuta cada pocos segundos.