Zend_Mobile_Push_Apns proporciona la capacidad de
enviar notificaciones push a APNS generalmente en
conjunto con Zend_Mobile_Push_Message_Apns;
sin embargo, hay un caso en el que no se utilizaría, y es al obtener
retroalimentación (feedback) del servidor APNS.
![]() |
Nota |
|---|---|
Antes de enviar mensajes, debe seguir los pasos de aprovisionamiento y despliegue descritos por Apple. |
Al implementar APNS, dispone de algunos componentes que
utilizará. Zend_Mobile_Push_Apns
que contiene los componentes del servidor y
Zend_Mobile_Push_Message_Apns que contiene
el mensaje que desea enviar. Generalmente, al enviar
notificaciones push a Apple debería hacerlo por lotes.
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_Apns();
$message->setAlert('Zend Mobile Push Example');
$message->setBadge(1);
$message->setSound('default');
$message->setId(time());
$message->setToken('ABCDEF0123456789');
$apns = new Zend_Mobile_Push_Apns();
$apns->setCertificate('/path/to/provisioning-certificate.pem');
// if you have a passphrase on your certificate:
// $apns->setCertificatePassphrase('foobar');
try {
$apns->connect(Zend_Mobile_Push_Apns::SERVER_SANDBOX_URI);
} catch (Zend_Mobile_Push_Exception_ServerUnavailable $e) {
// you can either attempt to reconnect here or try again later
exit(1);
} catch (Zend_Mobile_Push_Exception $e) {
echo 'APNS Connection Error:' . $e->getMessage();
exit(1);
}
try {
$apns->send($message);
} catch (Zend_Mobile_Push_Exception_InvalidToken $e) {
// you would likely want to remove the token from being sent to again
echo $e->getMessage();
} catch (Zend_Mobile_Push_Exception $e) {
// all other exceptions only require action to be sent
echo $e->getMessage();
}
$apns->close();
Tabla 50.3. Excepciones y técnicas de remediación
| Excepción | Significado | Manejo |
|---|---|---|
| Zend_Mobile_Push_Exception | Este tipo de excepciones son de naturaleza más genérica y se lanzan ya sea desde APNS o internamente durante la validación de entrada | Lea el mensaje y determine los pasos de remediación. |
| 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 le falte contenido requerido. | Verifique que el tamaño del payload esté dentro de los requisitos de APNS |
| Zend_Mobile_Push_Exception_InvalidToken | Cualquier forma de token inválido ocurrirá si el token ya no está registrado, falta un token o tiene un formato inválido. | Debe eliminar el token y no intentar enviar a él nuevamente. |
| Zend_Mobile_Push_Exception_InvalidTopic | Un topic inválido simplemente significa que el id del mensaje era demasiado largo o no era un entero. | Asegúrese de que el ID del mensaje sea un entero. |
![]() |
Advertencia |
|---|---|
Al enviar por lotes y estar enviando una gran cantidad de notificaciones push, debe asegurarse de usar usleep de vez en cuando. Esto garantizará que sus mensajes se entreguen y que APNS no simplemente le cuelgue la conexión. |
APNS tiene un servicio de retroalimentación al que debe escuchar. Apple indica que monitorea a los proveedores para asegurarse de que estén escuchando este servicio.
El servicio de retroalimentación simplemente devuelve un array de tokens de dispositivo y la hora. Puede usar la hora para asegurarse de que el dispositivo no se haya vuelto a registrar para notificaciones push desde el último envío.
$apns = new Zend_Mobile_Push_Apns();
$apns->setCertificate('/path/to/provisioning-certificate.pem');
try {
$apns->connect(Zend_Mobile_Push_Apns::SERVER_FEEDBACK_SANDBOX_URI);
} catch (Zend_Mobile_Push_Exception_ServerUnavailable $e) {
// you can either attempt to reconnect here or try again later
exit(1);
} catch (Zend_Mobile_Push_Exception $e) {
echo 'APNS Connection Error:' . $e->getMessage();
exit(1);
}
$tokens = $apns->feedback();
foreach ($tokens as $token => $time) {
echo $time . "\t" . $token . PHP_EOL;
}
$apns->close();
APNS 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_Apns
le permite hacer mensajes mucho más avanzados como se describe a continuación.
Las alertas pueden contener desde un simple mensaje de cuerpo hasta tener una clave de acción y una imagen de inicio (iOS 4). Es posible que solo desee proporcionar una clave de acción cuando solo se necesite una confirmación, O cuando busque localizar el botón con texto no estándar (es decir, no "View").
El siguiente ejemplo de código muestra alertas de los ejemplos de payload de APNS.
$message = new Zend_Mobile_Push_Message_Apns();
// message with different button
$message->setAlert('Bob wants to play poker', 'PLAY');
// message using apps localized strings w/ string replacements
$message->setAlert(null, null, 'GAME_PLAY_REQUEST_FORMAT', array('Jenna', 'Frank'));
Puede enviar a su aplicación datos personalizados que le permiten tomar decisiones basadas en las notificaciones, como sincronizar datos.
$message = new Zend_Mobile_Push_Message_Apns();
$message->addCustomData('foo', 'bar');
$message->addCustomData('foo', array('bar' => 1));
$message->addCustomData('bar', 'foo');
![]() |
Advertencia |
|---|---|
No puede usar una clave personalizada 'aps' ya que está reservada por Apple y se utiliza para los datos push principales. |
![[Note]](images/note.png)
![[Warning]](images/warning.png)