Zend_Mobile_Push_Gcm proporciona la capacidad de
enviar notificaciones push a dispositivos Android que contienen Google Services.
Un mensaje siempre se construirá con
Zend_Mobile_Push_Message_Gcm.
![]() |
Nota |
|---|---|
Antes de enviar y recibir mensajes, necesitará crear un Google API Project y configurar su aplicación Android para escuchar mensajes GCM. Si no ha hecho esto, siga el documento GCM: Getting Started. |
Al implementar GCM, utilizará algunos componentes:
Zend_Mobile_Push_Gcm
que contiene los componentes del servidor,
Zend_Mobile_Push_Message_Gcm que contiene
el mensaje que desea enviar, y
Zend_Mobile_Push_Response_Gcm que contiene
la respuesta de GCM. Cada mensaje enviado debe realizar una petición HTTP; así que
recuerde esto al enviar en lotes grandes.
La implementación real del código es bastante mínima; sin embargo, se deben tener en cuenta consideraciones sobre el manejo de errores.
$message = new Zend_Mobile_Push_Message_Gcm();
$message->addToken('ABCDEF0123456789');
$message->setData(array(
'foo' => 'bar',
'bar' => 'foo',
));
$gcm = new Zend_Mobile_Push_Gcm();
$gcm->setApiKey('YOUR_API_KEY');
try {
$response = $gcm->send($message);
} catch (Zend_Mobile_Push_Exception $e) {
// exceptions require action or implementation of exponential backoff.
die($e->getMessage());
}
// handle all errors and registration_id's
foreach ($response->getResults() as $k => $v) {
if ($v['registration_id']) {
printf("%s has a new registration id of: %s\r\n", $k, $v['registration_id']);
}
if ($v['error']) {
printf("%s had an error of: %s\r\n", $k, $v['error']);
}
if ($v['message_id']) {
printf("%s was successfully sent the message, message id is: %s", $k, $v['message_id']);
}
}
Tabla 50.4. Excepciones y técnicas de solución
| Excepción | Significado | Solución |
|---|---|---|
| Zend_Mobile_Push_Exception | Estos tipos de excepciones son de naturaleza más genérica y se lanzan bien desde gcm cuando hubo una excepción desconocida o internamente en la validación de entrada. | Lea el mensaje y determine los pasos de solución. |
| Zend_Mobile_Push_Exception_InvalidAuthToken | Es probable que su clave API se haya escrito mal o no tenga permisos para el servicio GCM. | Revise su proyecto en la página de Google APIs Console. |
| Zend_Mobile_Push_Exception_ServerUnavailable | Esta excepción significa que hubo un error interno del servidor O que el servidor denegó su solicitud y debería revisar la cabecera Retry-After. | Lea el mensaje de la excepción y utilice Exponential Backoff |
| Zend_Mobile_Push_Exception_InvalidPayload | Generalmente el payload no lanzará una excepción a menos que el tamaño del payload sea demasiado grande o el JSON sea demasiado grande. | Compruebe que el tamaño del payload está dentro de los requisitos de GCM, actualmente es de 4K. |
GCM ofrece la capacidad de enviar mensajes más avanzados; por
ejemplo, los ejemplos anteriores muestran la implementación más básica de un
mensaje. Zend_Mobile_Push_Message_Gcm
le permite hacer mensajería mucho más avanzada, como se describe a continuación.
Si se incluye, indica que el mensaje no debe enviarse inmediatamente si el dispositivo está inactivo. El servidor esperará a que el dispositivo se vuelva activo, y entonces solo se enviará el último mensaje de cada valor de collapse_key.
$message = new Zend_Mobile_Push_Message_Gcm();
$message->setDelayWhileIdle(true);
Puede establecer el tiempo de vida en segundos; por defecto GCM lo guardará durante 4 semanas. Además, si especifica un tiempo de vida, también debe establecer un ID (la collapse key). Generalmente es mejor usar los datos del mensaje para saber que es un mensaje único.
$message = new Zend_Mobile_Push_Message_Gcm();
$message->setTtl(86400);
$message->addData('key', 'value');
$message->setId(md5(json_encode($message->getData())));
GCM devuelve una respuesta que contiene detalles que es necesario entender. La mayoría de las veces solo puede enviar un mensaje, pero el servidor puede devolver información sobre el id del mensaje, cualquier error y posibles nuevos registration ids.
Los resultados se obtienen generalmente llamando al método getResults(). Sin embargo, puede preferir obtener solo ciertos resultados usando el método getResult(). El método getResult utiliza las constantes RESULT_* que corresponden al id del mensaje, al error o al registration id.
Existen varios métodos de utilidad para darle una mejor idea de lo que sucedió durante su envío. Los métodos getSuccessCount(), getFailureCount() y getCanonicalCount() le indican cuántos fueron exitosos, cuántos fallos y cuántas actualizaciones de registration ids tiene.
![[Note]](images/note.png)